1999-12-16 23:11:07 +00:00
|
|
|
/*
|
2010-07-11 23:46:54 +00:00
|
|
|
* Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
|
2004-03-05 05:14:21 +00:00
|
|
|
* Copyright (C) 1999-2003 Internet Software Consortium.
|
2000-08-01 01:33:37 +00:00
|
|
|
*
|
2007-06-18 23:47:57 +00:00
|
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
1999-12-16 23:11:07 +00:00
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
|
|
* copyright notice and this permission notice appear in all copies.
|
2000-08-01 01:33:37 +00:00
|
|
|
*
|
2004-03-05 05:14:21 +00:00
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
|
|
|
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
|
|
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
|
|
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
|
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
|
|
|
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
1999-12-16 23:11:07 +00:00
|
|
|
*/
|
|
|
|
|
2010-07-11 23:46:54 +00:00
|
|
|
/* $Id: zoneconf.c,v 1.163 2010/07/11 23:46:54 tbox Exp $ */
|
2005-04-27 04:57:32 +00:00
|
|
|
|
|
|
|
/*% */
|
2000-06-22 22:00:42 +00:00
|
|
|
|
1999-12-16 23:11:07 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <isc/buffer.h>
|
2002-01-21 11:00:25 +00:00
|
|
|
#include <isc/file.h>
|
2000-08-10 00:53:36 +00:00
|
|
|
#include <isc/mem.h>
|
2001-08-30 05:23:00 +00:00
|
|
|
#include <isc/print.h>
|
2009-01-27 22:30:00 +00:00
|
|
|
#include <isc/stats.h>
|
2000-05-08 19:23:32 +00:00
|
|
|
#include <isc/string.h> /* Required for HP/UX (and others?) */
|
2000-04-28 01:12:23 +00:00
|
|
|
#include <isc/util.h>
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2000-05-08 14:38:29 +00:00
|
|
|
#include <dns/acl.h>
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <dns/fixedname.h>
|
2000-12-01 18:22:17 +00:00
|
|
|
#include <dns/log.h>
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <dns/name.h>
|
|
|
|
#include <dns/rdatatype.h>
|
2000-08-29 03:48:00 +00:00
|
|
|
#include <dns/ssu.h>
|
2008-04-03 05:55:52 +00:00
|
|
|
#include <dns/stats.h>
|
2003-02-26 23:29:00 +00:00
|
|
|
#include <dns/view.h>
|
1999-12-16 23:11:07 +00:00
|
|
|
#include <dns/zone.h>
|
2000-11-27 19:42:38 +00:00
|
|
|
|
2005-02-10 05:53:43 +00:00
|
|
|
#include <named/client.h>
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <named/config.h>
|
2000-12-01 18:22:17 +00:00
|
|
|
#include <named/globals.h>
|
|
|
|
#include <named/log.h>
|
2004-01-05 06:56:44 +00:00
|
|
|
#include <named/server.h>
|
2000-11-27 19:42:38 +00:00
|
|
|
#include <named/zoneconf.h>
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2008-05-21 23:17:21 +00:00
|
|
|
/* ACLs associated with zone */
|
|
|
|
typedef enum {
|
|
|
|
allow_notify,
|
|
|
|
allow_query,
|
|
|
|
allow_transfer,
|
|
|
|
allow_update,
|
|
|
|
allow_update_forwarding
|
|
|
|
} acl_type_t;
|
|
|
|
|
2000-05-25 19:27:48 +00:00
|
|
|
#define RETERR(x) do { \
|
|
|
|
isc_result_t _r = (x); \
|
|
|
|
if (_r != ISC_R_SUCCESS) \
|
|
|
|
return (_r); \
|
|
|
|
} while (0)
|
|
|
|
|
2009-06-10 00:27:22 +00:00
|
|
|
#define CHECK(x) do { \
|
|
|
|
result = (x); \
|
|
|
|
if (result != ISC_R_SUCCESS) \
|
|
|
|
goto cleanup; \
|
|
|
|
} while (0)
|
|
|
|
|
2005-04-27 04:57:32 +00:00
|
|
|
/*%
|
1999-12-16 23:11:07 +00:00
|
|
|
* Convenience function for configuring a single zone ACL.
|
|
|
|
*/
|
|
|
|
static isc_result_t
|
2006-02-28 02:39:52 +00:00
|
|
|
configure_zone_acl(const cfg_obj_t *zconfig, const cfg_obj_t *vconfig,
|
2008-05-21 23:17:21 +00:00
|
|
|
const cfg_obj_t *config, acl_type_t acltype,
|
2008-01-18 23:46:58 +00:00
|
|
|
cfg_aclconfctx_t *actx, dns_zone_t *zone,
|
1999-12-16 23:11:07 +00:00
|
|
|
void (*setzacl)(dns_zone_t *, dns_acl_t *),
|
|
|
|
void (*clearzacl)(dns_zone_t *))
|
|
|
|
{
|
|
|
|
isc_result_t result;
|
2008-05-21 23:17:21 +00:00
|
|
|
const cfg_obj_t *maps[5] = {NULL, NULL, NULL, NULL, NULL};
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *aclobj = NULL;
|
2001-03-04 21:21:39 +00:00
|
|
|
int i = 0;
|
2008-05-21 23:17:21 +00:00
|
|
|
dns_acl_t **aclp = NULL, *acl = NULL;
|
|
|
|
const char *aclname;
|
2008-05-21 23:47:01 +00:00
|
|
|
dns_view_t *view;
|
2008-05-21 23:17:21 +00:00
|
|
|
|
2008-05-21 23:47:01 +00:00
|
|
|
view = dns_zone_getview(zone);
|
2008-05-21 23:17:21 +00:00
|
|
|
|
|
|
|
switch (acltype) {
|
|
|
|
case allow_notify:
|
2008-05-21 23:47:01 +00:00
|
|
|
if (view != NULL)
|
|
|
|
aclp = &view->notifyacl;
|
2008-05-21 23:17:21 +00:00
|
|
|
aclname = "allow-notify";
|
|
|
|
break;
|
|
|
|
case allow_query:
|
2008-05-21 23:47:01 +00:00
|
|
|
if (view != NULL)
|
|
|
|
aclp = &view->queryacl;
|
2008-05-21 23:17:21 +00:00
|
|
|
aclname = "allow-query";
|
|
|
|
break;
|
|
|
|
case allow_transfer:
|
2008-05-21 23:47:01 +00:00
|
|
|
if (view != NULL)
|
|
|
|
aclp = &view->transferacl;
|
2008-05-21 23:17:21 +00:00
|
|
|
aclname = "allow-transfer";
|
|
|
|
break;
|
|
|
|
case allow_update:
|
2008-05-21 23:47:01 +00:00
|
|
|
if (view != NULL)
|
|
|
|
aclp = &view->updateacl;
|
2008-05-21 23:17:21 +00:00
|
|
|
aclname = "allow-update";
|
|
|
|
break;
|
|
|
|
case allow_update_forwarding:
|
2008-05-21 23:47:01 +00:00
|
|
|
if (view != NULL)
|
|
|
|
aclp = &view->upfwdacl;
|
2008-05-21 23:17:21 +00:00
|
|
|
aclname = "allow-update-forwarding";
|
|
|
|
break;
|
2008-05-21 23:47:01 +00:00
|
|
|
default:
|
|
|
|
INSIST(0);
|
|
|
|
return (ISC_R_FAILURE);
|
2008-05-21 23:17:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* First check to see if ACL is defined within the zone */
|
|
|
|
if (zconfig != NULL) {
|
|
|
|
maps[0] = cfg_tuple_get(zconfig, "options");
|
|
|
|
ns_config_get(maps, aclname, &aclobj);
|
|
|
|
if (aclobj != NULL) {
|
|
|
|
aclp = NULL;
|
|
|
|
goto parse_acl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Failing that, see if there's a default ACL already in the view */
|
|
|
|
if (aclp != NULL && *aclp != NULL) {
|
|
|
|
(*setzacl)(zone, *aclp);
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2008-05-21 23:17:21 +00:00
|
|
|
/* Check for default ACLs that haven't been parsed yet */
|
2001-03-04 21:21:39 +00:00
|
|
|
if (vconfig != NULL)
|
|
|
|
maps[i++] = cfg_tuple_get(vconfig, "options");
|
|
|
|
if (config != NULL) {
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *options = NULL;
|
2001-03-04 21:21:39 +00:00
|
|
|
(void)cfg_map_get(config, "options", &options);
|
|
|
|
if (options != NULL)
|
|
|
|
maps[i++] = options;
|
2000-02-22 21:24:24 +00:00
|
|
|
}
|
2006-05-16 03:35:56 +00:00
|
|
|
maps[i++] = ns_g_defaults;
|
2001-03-04 21:21:39 +00:00
|
|
|
maps[i] = NULL;
|
|
|
|
|
|
|
|
result = ns_config_get(maps, aclname, &aclobj);
|
|
|
|
if (aclobj == NULL) {
|
1999-12-16 23:11:07 +00:00
|
|
|
(*clearzacl)(zone);
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2008-05-21 23:17:21 +00:00
|
|
|
parse_acl:
|
2005-01-11 03:46:11 +00:00
|
|
|
result = cfg_acl_fromconfig(aclobj, config, ns_g_lctx, actx,
|
2008-05-21 23:17:21 +00:00
|
|
|
dns_zone_getmctx(zone), 0, &acl);
|
2001-03-04 21:21:39 +00:00
|
|
|
if (result != ISC_R_SUCCESS)
|
|
|
|
return (result);
|
2008-05-21 23:17:21 +00:00
|
|
|
(*setzacl)(zone, acl);
|
|
|
|
|
2008-05-21 23:47:01 +00:00
|
|
|
/* Set the view default now */
|
2008-05-21 23:17:21 +00:00
|
|
|
if (aclp != NULL)
|
|
|
|
dns_acl_attach(acl, aclp);
|
|
|
|
|
|
|
|
dns_acl_detach(&acl);
|
2001-03-04 21:21:39 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
1999-12-16 23:11:07 +00:00
|
|
|
}
|
|
|
|
|
2005-04-27 04:57:32 +00:00
|
|
|
/*%
|
2001-03-04 21:21:39 +00:00
|
|
|
* Parse the zone update-policy statement.
|
2000-05-25 19:27:48 +00:00
|
|
|
*/
|
2001-03-04 21:21:39 +00:00
|
|
|
static isc_result_t
|
2009-06-10 00:27:22 +00:00
|
|
|
configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone,
|
2009-10-12 20:48:12 +00:00
|
|
|
const char *zname)
|
|
|
|
{
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *updatepolicy = NULL;
|
|
|
|
const cfg_listelt_t *element, *element2;
|
2001-03-04 21:21:39 +00:00
|
|
|
dns_ssutable_t *table = NULL;
|
|
|
|
isc_mem_t *mctx = dns_zone_getmctx(zone);
|
2009-07-14 23:47:54 +00:00
|
|
|
isc_boolean_t autoddns = ISC_FALSE;
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_result_t result;
|
|
|
|
|
|
|
|
(void)cfg_map_get(zconfig, "update-policy", &updatepolicy);
|
2009-06-10 00:27:22 +00:00
|
|
|
|
2009-07-14 22:54:57 +00:00
|
|
|
if (updatepolicy == NULL) {
|
2006-01-05 03:32:50 +00:00
|
|
|
dns_zone_setssutable(zone, NULL);
|
2001-03-04 21:21:39 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
2006-01-05 03:32:50 +00:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2009-07-14 23:47:54 +00:00
|
|
|
if (cfg_obj_isstring(updatepolicy) &&
|
|
|
|
strcmp("local", cfg_obj_asstring(updatepolicy)) == 0) {
|
|
|
|
autoddns = ISC_TRUE;
|
|
|
|
updatepolicy = NULL;
|
|
|
|
}
|
2009-07-14 22:54:57 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
result = dns_ssutable_create(mctx, &table);
|
|
|
|
if (result != ISC_R_SUCCESS)
|
|
|
|
return (result);
|
|
|
|
|
|
|
|
for (element = cfg_list_first(updatepolicy);
|
|
|
|
element != NULL;
|
|
|
|
element = cfg_list_next(element))
|
|
|
|
{
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *stmt = cfg_listelt_value(element);
|
|
|
|
const cfg_obj_t *mode = cfg_tuple_get(stmt, "mode");
|
|
|
|
const cfg_obj_t *identity = cfg_tuple_get(stmt, "identity");
|
|
|
|
const cfg_obj_t *matchtype = cfg_tuple_get(stmt, "matchtype");
|
|
|
|
const cfg_obj_t *dname = cfg_tuple_get(stmt, "name");
|
|
|
|
const cfg_obj_t *typelist = cfg_tuple_get(stmt, "types");
|
2005-08-23 02:36:11 +00:00
|
|
|
const char *str;
|
2001-03-05 12:04:46 +00:00
|
|
|
isc_boolean_t grant = ISC_FALSE;
|
2009-06-10 00:27:22 +00:00
|
|
|
isc_boolean_t usezone = ISC_FALSE;
|
2001-03-05 12:04:46 +00:00
|
|
|
unsigned int mtype = DNS_SSUMATCHTYPE_NAME;
|
2001-03-04 21:21:39 +00:00
|
|
|
dns_fixedname_t fname, fident;
|
|
|
|
isc_buffer_t b;
|
|
|
|
dns_rdatatype_t *types;
|
|
|
|
unsigned int i, n;
|
|
|
|
|
|
|
|
str = cfg_obj_asstring(mode);
|
|
|
|
if (strcasecmp(str, "grant") == 0)
|
|
|
|
grant = ISC_TRUE;
|
|
|
|
else if (strcasecmp(str, "deny") == 0)
|
|
|
|
grant = ISC_FALSE;
|
|
|
|
else
|
|
|
|
INSIST(0);
|
|
|
|
|
|
|
|
str = cfg_obj_asstring(matchtype);
|
|
|
|
if (strcasecmp(str, "name") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_NAME;
|
|
|
|
else if (strcasecmp(str, "subdomain") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SUBDOMAIN;
|
|
|
|
else if (strcasecmp(str, "wildcard") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_WILDCARD;
|
|
|
|
else if (strcasecmp(str, "self") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SELF;
|
2006-02-16 01:34:24 +00:00
|
|
|
else if (strcasecmp(str, "selfsub") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SELFSUB;
|
|
|
|
else if (strcasecmp(str, "selfwild") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SELFWILD;
|
2006-12-04 01:54:53 +00:00
|
|
|
else if (strcasecmp(str, "ms-self") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SELFMS;
|
|
|
|
else if (strcasecmp(str, "krb5-self") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SELFKRB5;
|
|
|
|
else if (strcasecmp(str, "ms-subdomain") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SUBDOMAINMS;
|
|
|
|
else if (strcasecmp(str, "krb5-subdomain") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SUBDOMAINKRB5;
|
2008-01-02 05:13:42 +00:00
|
|
|
else if (strcasecmp(str, "tcp-self") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_TCPSELF;
|
|
|
|
else if (strcasecmp(str, "6to4-self") == 0)
|
|
|
|
mtype = DNS_SSUMATCHTYPE_6TO4SELF;
|
2009-06-10 00:27:22 +00:00
|
|
|
else if (strcasecmp(str, "zonesub") == 0) {
|
|
|
|
mtype = DNS_SSUMATCHTYPE_SUBDOMAIN;
|
|
|
|
usezone = ISC_TRUE;
|
|
|
|
} else
|
2001-03-04 21:21:39 +00:00
|
|
|
INSIST(0);
|
|
|
|
|
|
|
|
dns_fixedname_init(&fident);
|
|
|
|
str = cfg_obj_asstring(identity);
|
|
|
|
isc_buffer_init(&b, str, strlen(str));
|
|
|
|
isc_buffer_add(&b, strlen(str));
|
|
|
|
result = dns_name_fromtext(dns_fixedname_name(&fident), &b,
|
2009-09-01 00:22:28 +00:00
|
|
|
dns_rootname, 0, NULL);
|
2001-03-04 21:21:39 +00:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
|
|
|
cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
|
|
|
|
"'%s' is not a valid name", str);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
dns_fixedname_init(&fname);
|
2009-06-10 00:27:22 +00:00
|
|
|
if (usezone) {
|
|
|
|
result = dns_name_copy(dns_zone_getorigin(zone),
|
|
|
|
dns_fixedname_name(&fname),
|
|
|
|
NULL);
|
|
|
|
if (result != ISC_R_SUCCESS) {
|
|
|
|
cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
|
|
|
|
"error copying origin: %s",
|
|
|
|
isc_result_totext(result));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
str = cfg_obj_asstring(dname);
|
|
|
|
isc_buffer_init(&b, str, strlen(str));
|
|
|
|
isc_buffer_add(&b, strlen(str));
|
|
|
|
result = dns_name_fromtext(dns_fixedname_name(&fname),
|
2009-09-01 00:22:28 +00:00
|
|
|
&b, dns_rootname, 0, NULL);
|
2009-06-10 00:27:22 +00:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
|
|
|
cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
|
|
|
|
"'%s' is not a valid name", str);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
n = ns_config_listcount(typelist);
|
|
|
|
if (n == 0)
|
|
|
|
types = NULL;
|
|
|
|
else {
|
|
|
|
types = isc_mem_get(mctx, n * sizeof(dns_rdatatype_t));
|
|
|
|
if (types == NULL) {
|
|
|
|
result = ISC_R_NOMEMORY;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
for (element2 = cfg_list_first(typelist);
|
|
|
|
element2 != NULL;
|
|
|
|
element2 = cfg_list_next(element2))
|
|
|
|
{
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *typeobj;
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_textregion_t r;
|
|
|
|
|
|
|
|
INSIST(i < n);
|
|
|
|
|
|
|
|
typeobj = cfg_listelt_value(element2);
|
|
|
|
str = cfg_obj_asstring(typeobj);
|
2005-08-23 02:36:11 +00:00
|
|
|
DE_CONST(str, r.base);
|
2001-03-04 21:21:39 +00:00
|
|
|
r.length = strlen(str);
|
|
|
|
|
|
|
|
result = dns_rdatatype_fromtext(&types[i++], &r);
|
|
|
|
if (result != ISC_R_SUCCESS) {
|
|
|
|
cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
|
|
|
|
"'%s' is not a valid type", str);
|
|
|
|
isc_mem_put(mctx, types,
|
|
|
|
n * sizeof(dns_rdatatype_t));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
INSIST(i == n);
|
|
|
|
|
|
|
|
result = dns_ssutable_addrule(table, grant,
|
|
|
|
dns_fixedname_name(&fident),
|
|
|
|
mtype,
|
|
|
|
dns_fixedname_name(&fname),
|
|
|
|
n, types);
|
|
|
|
if (types != NULL)
|
|
|
|
isc_mem_put(mctx, types, n * sizeof(dns_rdatatype_t));
|
|
|
|
if (result != ISC_R_SUCCESS) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2009-06-10 00:27:22 +00:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2009-06-10 00:27:22 +00:00
|
|
|
/*
|
2009-07-14 22:54:57 +00:00
|
|
|
* If "update-policy local;" and a session key exists,
|
|
|
|
* then use the default policy, which is equivalent to:
|
|
|
|
* update-policy { grant <session-keyname> zonesub any; };
|
2009-06-10 00:27:22 +00:00
|
|
|
*/
|
|
|
|
if (autoddns) {
|
|
|
|
dns_rdatatype_t any = dns_rdatatype_any;
|
|
|
|
|
2009-07-14 22:54:57 +00:00
|
|
|
if (ns_g_server->session_keyname == NULL) {
|
2009-06-10 00:27:22 +00:00
|
|
|
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
|
|
|
NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
|
|
|
|
"failed to enable auto DDNS policy "
|
|
|
|
"for zone %s: session key not found",
|
|
|
|
zname);
|
|
|
|
result = ISC_R_NOTFOUND;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = dns_ssutable_addrule(table, ISC_TRUE,
|
2009-07-14 22:54:57 +00:00
|
|
|
ns_g_server->session_keyname,
|
2009-06-10 00:27:22 +00:00
|
|
|
DNS_SSUMATCHTYPE_SUBDOMAIN,
|
|
|
|
dns_zone_getorigin(zone),
|
|
|
|
1, &any);
|
|
|
|
|
|
|
|
if (result != ISC_R_SUCCESS)
|
|
|
|
goto cleanup;
|
2000-01-21 19:22:35 +00:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
result = ISC_R_SUCCESS;
|
|
|
|
dns_zone_setssutable(zone, table);
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
dns_ssutable_detach(&table);
|
|
|
|
return (result);
|
|
|
|
}
|
|
|
|
|
2005-04-27 04:57:32 +00:00
|
|
|
/*%
|
2001-03-04 21:21:39 +00:00
|
|
|
* Convert a config file zone type into a server zone type.
|
|
|
|
*/
|
|
|
|
static inline dns_zonetype_t
|
2006-02-28 02:39:52 +00:00
|
|
|
zonetype_fromconfig(const cfg_obj_t *map) {
|
|
|
|
const cfg_obj_t *obj = NULL;
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_result_t result;
|
|
|
|
|
|
|
|
result = cfg_map_get(map, "type", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
return (ns_config_getzonetype(obj));
|
2000-01-21 19:22:35 +00:00
|
|
|
}
|
|
|
|
|
2005-04-27 04:57:32 +00:00
|
|
|
/*%
|
2000-08-10 00:53:36 +00:00
|
|
|
* Helper function for strtoargv(). Pardon the gratuitous recursion.
|
|
|
|
*/
|
|
|
|
static isc_result_t
|
2000-08-14 03:50:59 +00:00
|
|
|
strtoargvsub(isc_mem_t *mctx, char *s, unsigned int *argcp,
|
|
|
|
char ***argvp, unsigned int n)
|
|
|
|
{
|
2000-08-10 00:53:36 +00:00
|
|
|
isc_result_t result;
|
2008-01-18 23:46:58 +00:00
|
|
|
|
2000-08-10 00:53:36 +00:00
|
|
|
/* Discard leading whitespace. */
|
|
|
|
while (*s == ' ' || *s == '\t')
|
|
|
|
s++;
|
2008-01-18 23:46:58 +00:00
|
|
|
|
2000-08-10 00:53:36 +00:00
|
|
|
if (*s == '\0') {
|
|
|
|
/* We have reached the end of the string. */
|
|
|
|
*argcp = n;
|
|
|
|
*argvp = isc_mem_get(mctx, n * sizeof(char *));
|
|
|
|
if (*argvp == NULL)
|
|
|
|
return (ISC_R_NOMEMORY);
|
|
|
|
} else {
|
|
|
|
char *p = s;
|
|
|
|
while (*p != ' ' && *p != '\t' && *p != '\0')
|
|
|
|
p++;
|
|
|
|
if (*p != '\0')
|
|
|
|
*p++ = '\0';
|
|
|
|
|
|
|
|
result = strtoargvsub(mctx, p, argcp, argvp, n + 1);
|
|
|
|
if (result != ISC_R_SUCCESS)
|
|
|
|
return (result);
|
|
|
|
(*argvp)[n] = s;
|
|
|
|
}
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
|
|
|
|
2005-04-27 04:57:32 +00:00
|
|
|
/*%
|
2000-08-10 00:53:36 +00:00
|
|
|
* Tokenize the string "s" into whitespace-separated words,
|
|
|
|
* return the number of words in '*argcp' and an array
|
|
|
|
* of pointers to the words in '*argvp'. The caller
|
|
|
|
* must free the array using isc_mem_put(). The string
|
|
|
|
* is modified in-place.
|
|
|
|
*/
|
|
|
|
static isc_result_t
|
2000-08-14 03:50:59 +00:00
|
|
|
strtoargv(isc_mem_t *mctx, char *s, unsigned int *argcp, char ***argvp) {
|
2000-08-10 00:53:36 +00:00
|
|
|
return (strtoargvsub(mctx, s, argcp, argvp, 0));
|
|
|
|
}
|
|
|
|
|
2004-02-27 20:41:51 +00:00
|
|
|
static void
|
2006-02-28 02:39:52 +00:00
|
|
|
checknames(dns_zonetype_t ztype, const cfg_obj_t **maps,
|
|
|
|
const cfg_obj_t **objp)
|
|
|
|
{
|
2004-02-27 20:41:51 +00:00
|
|
|
const char *zone = NULL;
|
2004-04-20 14:11:47 +00:00
|
|
|
isc_result_t result;
|
2004-02-27 20:41:51 +00:00
|
|
|
|
|
|
|
switch (ztype) {
|
|
|
|
case dns_zone_slave: zone = "slave"; break;
|
|
|
|
case dns_zone_master: zone = "master"; break;
|
|
|
|
default:
|
|
|
|
INSIST(0);
|
|
|
|
}
|
2004-04-20 14:11:47 +00:00
|
|
|
result = ns_checknames_get(maps, zone, objp);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2004-02-27 20:41:51 +00:00
|
|
|
}
|
|
|
|
|
1999-12-23 00:09:04 +00:00
|
|
|
isc_result_t
|
2006-02-28 02:39:52 +00:00
|
|
|
ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
|
|
|
const cfg_obj_t *zconfig, cfg_aclconfctx_t *ac,
|
|
|
|
dns_zone_t *zone)
|
1999-12-16 23:11:07 +00:00
|
|
|
{
|
|
|
|
isc_result_t result;
|
2005-08-23 02:36:11 +00:00
|
|
|
const char *zname;
|
2001-03-04 21:21:39 +00:00
|
|
|
dns_rdataclass_t zclass;
|
2001-08-07 01:58:59 +00:00
|
|
|
dns_rdataclass_t vclass;
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *maps[5];
|
|
|
|
const cfg_obj_t *zoptions = NULL;
|
|
|
|
const cfg_obj_t *options = NULL;
|
|
|
|
const cfg_obj_t *obj;
|
1999-12-16 23:11:07 +00:00
|
|
|
const char *filename = NULL;
|
2001-03-05 12:04:46 +00:00
|
|
|
dns_notifytype_t notifytype = dns_notifytype_yes;
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_sockaddr_t *addrs;
|
|
|
|
dns_name_t **keynames;
|
|
|
|
isc_uint32_t count;
|
2000-08-10 00:53:36 +00:00
|
|
|
char *cpval;
|
|
|
|
unsigned int dbargc;
|
|
|
|
char **dbargv;
|
|
|
|
static char default_dbtype[] = "rbt";
|
|
|
|
isc_mem_t *mctx = dns_zone_getmctx(zone);
|
2001-04-12 21:09:35 +00:00
|
|
|
dns_dialuptype_t dialup = dns_dialuptype_no;
|
2001-03-04 21:21:39 +00:00
|
|
|
dns_zonetype_t ztype;
|
|
|
|
int i;
|
2001-08-30 05:23:00 +00:00
|
|
|
isc_int32_t journal_size;
|
2002-07-29 06:58:46 +00:00
|
|
|
isc_boolean_t multi;
|
2003-02-26 23:29:00 +00:00
|
|
|
isc_boolean_t alt;
|
|
|
|
dns_view_t *view;
|
2004-02-27 20:41:51 +00:00
|
|
|
isc_boolean_t check = ISC_FALSE, fail = ISC_FALSE;
|
2006-01-05 23:45:34 +00:00
|
|
|
isc_boolean_t warn = ISC_FALSE, ignore = ISC_FALSE;
|
2004-10-14 00:49:34 +00:00
|
|
|
isc_boolean_t ixfrdiff;
|
2005-06-20 01:05:33 +00:00
|
|
|
dns_masterformat_t masterformat;
|
2009-01-27 22:30:00 +00:00
|
|
|
isc_stats_t *zoneqrystats;
|
2008-04-03 05:55:52 +00:00
|
|
|
isc_boolean_t zonestats_on;
|
2008-04-02 02:37:42 +00:00
|
|
|
int seconds;
|
2000-07-31 19:36:48 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
i = 0;
|
|
|
|
if (zconfig != NULL) {
|
|
|
|
zoptions = cfg_tuple_get(zconfig, "options");
|
|
|
|
maps[i++] = zoptions;
|
|
|
|
}
|
|
|
|
if (vconfig != NULL)
|
|
|
|
maps[i++] = cfg_tuple_get(vconfig, "options");
|
|
|
|
if (config != NULL) {
|
|
|
|
(void)cfg_map_get(config, "options", &options);
|
|
|
|
if (options != NULL)
|
|
|
|
maps[i++] = options;
|
|
|
|
}
|
|
|
|
maps[i++] = ns_g_defaults;
|
|
|
|
maps[i++] = NULL;
|
2001-08-07 01:58:59 +00:00
|
|
|
|
|
|
|
if (vconfig != NULL)
|
|
|
|
RETERR(ns_config_getclass(cfg_tuple_get(vconfig, "class"),
|
|
|
|
dns_rdataclass_in, &vclass));
|
|
|
|
else
|
|
|
|
vclass = dns_rdataclass_in;
|
|
|
|
|
2000-05-25 19:27:48 +00:00
|
|
|
/*
|
|
|
|
* Configure values common to all zone types.
|
|
|
|
*/
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
zname = cfg_obj_asstring(cfg_tuple_get(zconfig, "name"));
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-08-07 01:58:59 +00:00
|
|
|
RETERR(ns_config_getclass(cfg_tuple_get(zconfig, "class"),
|
|
|
|
vclass, &zclass));
|
2001-03-04 21:21:39 +00:00
|
|
|
dns_zone_setclass(zone, zclass);
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
ztype = zonetype_fromconfig(zoptions);
|
|
|
|
dns_zone_settype(zone, ztype);
|
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = cfg_map_get(zoptions, "database", &obj);
|
|
|
|
if (result == ISC_R_SUCCESS)
|
2005-08-23 02:36:11 +00:00
|
|
|
cpval = isc_mem_strdup(mctx, cfg_obj_asstring(obj));
|
2001-03-04 21:21:39 +00:00
|
|
|
else
|
2000-08-10 00:53:36 +00:00
|
|
|
cpval = default_dbtype;
|
2005-08-23 02:36:11 +00:00
|
|
|
|
|
|
|
if (cpval == NULL)
|
|
|
|
return(ISC_R_NOMEMORY);
|
|
|
|
|
|
|
|
result = strtoargv(mctx, cpval, &dbargc, &dbargv);
|
|
|
|
if (result != ISC_R_SUCCESS && cpval != default_dbtype) {
|
|
|
|
isc_mem_free(mctx, cpval);
|
|
|
|
return (result);
|
|
|
|
}
|
|
|
|
|
2000-08-22 05:14:59 +00:00
|
|
|
/*
|
|
|
|
* ANSI C is strange here. There is no logical reason why (char **)
|
|
|
|
* cannot be promoted automatically to (const char * const *) by the
|
|
|
|
* compiler w/o generating a warning.
|
|
|
|
*/
|
2005-08-23 02:36:11 +00:00
|
|
|
result = dns_zone_setdbtype(zone, dbargc, (const char * const *)dbargv);
|
2000-08-10 00:53:36 +00:00
|
|
|
isc_mem_put(mctx, dbargv, dbargc * sizeof(*dbargv));
|
2005-08-23 02:36:11 +00:00
|
|
|
if (cpval != default_dbtype)
|
|
|
|
isc_mem_free(mctx, cpval);
|
|
|
|
if (result != ISC_R_SUCCESS)
|
|
|
|
return (result);
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = cfg_map_get(zoptions, "file", &obj);
|
|
|
|
if (result == ISC_R_SUCCESS)
|
|
|
|
filename = cfg_obj_asstring(obj);
|
2005-06-20 01:05:33 +00:00
|
|
|
|
2010-07-11 00:12:57 +00:00
|
|
|
/*
|
|
|
|
* Unless we're using some alternative database, a master zone
|
|
|
|
* will be needing a master file.
|
|
|
|
*/
|
|
|
|
if (ztype == dns_zone_master && cpval == default_dbtype) {
|
|
|
|
if (filename == NULL) {
|
|
|
|
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
|
|
|
NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
|
|
|
|
"zone '%s': 'file' not specified",
|
|
|
|
zname);
|
|
|
|
return (ISC_R_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!isc_file_exists(filename)) {
|
|
|
|
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
|
|
|
NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
|
|
|
|
"zone '%s': master file not found",
|
|
|
|
zname);
|
|
|
|
return (ISC_R_NOTFOUND);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-06-20 01:05:33 +00:00
|
|
|
masterformat = dns_masterformat_text;
|
|
|
|
obj = NULL;
|
|
|
|
result= ns_config_get(maps, "masterfile-format", &obj);
|
|
|
|
if (result == ISC_R_SUCCESS) {
|
2005-08-23 02:36:11 +00:00
|
|
|
const char *masterformatstr = cfg_obj_asstring(obj);
|
2005-06-20 01:05:33 +00:00
|
|
|
|
|
|
|
if (strcasecmp(masterformatstr, "text") == 0)
|
|
|
|
masterformat = dns_masterformat_text;
|
|
|
|
else if (strcasecmp(masterformatstr, "raw") == 0)
|
|
|
|
masterformat = dns_masterformat_raw;
|
|
|
|
else
|
|
|
|
INSIST(0);
|
|
|
|
}
|
|
|
|
RETERR(dns_zone_setfile2(zone, filename, masterformat));
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2004-10-07 02:15:14 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = cfg_map_get(zoptions, "journal", &obj);
|
|
|
|
if (result == ISC_R_SUCCESS)
|
|
|
|
RETERR(dns_zone_setjournal(zone, cfg_obj_asstring(obj)));
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
if (ztype == dns_zone_slave)
|
|
|
|
RETERR(configure_zone_acl(zconfig, vconfig, config,
|
2008-05-21 23:17:21 +00:00
|
|
|
allow_notify, ac, zone,
|
2000-08-22 05:14:59 +00:00
|
|
|
dns_zone_setnotifyacl,
|
|
|
|
dns_zone_clearnotifyacl));
|
2000-05-25 19:27:48 +00:00
|
|
|
/*
|
|
|
|
* XXXAG This probably does not make sense for stubs.
|
|
|
|
*/
|
2001-03-04 21:21:39 +00:00
|
|
|
RETERR(configure_zone_acl(zconfig, vconfig, config,
|
2008-05-21 23:17:21 +00:00
|
|
|
allow_query, ac, zone,
|
2000-05-25 19:27:48 +00:00
|
|
|
dns_zone_setqueryacl,
|
|
|
|
dns_zone_clearqueryacl));
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "dialup", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
if (cfg_obj_isboolean(obj)) {
|
|
|
|
if (cfg_obj_asboolean(obj))
|
|
|
|
dialup = dns_dialuptype_yes;
|
|
|
|
else
|
|
|
|
dialup = dns_dialuptype_no;
|
|
|
|
} else {
|
2005-08-23 02:36:11 +00:00
|
|
|
const char *dialupstr = cfg_obj_asstring(obj);
|
2001-03-04 21:21:39 +00:00
|
|
|
if (strcasecmp(dialupstr, "notify") == 0)
|
|
|
|
dialup = dns_dialuptype_notify;
|
|
|
|
else if (strcasecmp(dialupstr, "notify-passive") == 0)
|
|
|
|
dialup = dns_dialuptype_notifypassive;
|
|
|
|
else if (strcasecmp(dialupstr, "refresh") == 0)
|
|
|
|
dialup = dns_dialuptype_refresh;
|
|
|
|
else if (strcasecmp(dialupstr, "passive") == 0)
|
|
|
|
dialup = dns_dialuptype_passive;
|
|
|
|
else
|
|
|
|
INSIST(0);
|
|
|
|
}
|
2000-11-11 01:05:43 +00:00
|
|
|
dns_zone_setdialup(zone, dialup);
|
2000-05-25 19:27:48 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "zone-statistics", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2008-04-03 05:55:52 +00:00
|
|
|
zonestats_on = cfg_obj_asboolean(obj);
|
|
|
|
zoneqrystats = NULL;
|
|
|
|
if (zonestats_on) {
|
2009-01-27 22:30:00 +00:00
|
|
|
RETERR(isc_stats_create(mctx, &zoneqrystats,
|
|
|
|
dns_nsstatscounter_max));
|
2008-04-03 05:55:52 +00:00
|
|
|
}
|
|
|
|
dns_zone_setrequeststats(zone, zoneqrystats);
|
|
|
|
if (zoneqrystats != NULL)
|
2009-01-27 22:30:00 +00:00
|
|
|
isc_stats_detach(&zoneqrystats);
|
2000-11-07 23:49:42 +00:00
|
|
|
|
2000-05-25 19:27:48 +00:00
|
|
|
/*
|
|
|
|
* Configure master functionality. This applies
|
|
|
|
* to primary masters (type "master") and slaves
|
|
|
|
* acting as masters (type "slave"), but not to stubs.
|
|
|
|
*/
|
2001-03-04 21:21:39 +00:00
|
|
|
if (ztype != dns_zone_stub) {
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "notify", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
if (cfg_obj_isboolean(obj)) {
|
|
|
|
if (cfg_obj_asboolean(obj))
|
|
|
|
notifytype = dns_notifytype_yes;
|
|
|
|
else
|
|
|
|
notifytype = dns_notifytype_no;
|
|
|
|
} else {
|
2005-08-23 02:36:11 +00:00
|
|
|
const char *notifystr = cfg_obj_asstring(obj);
|
2001-03-04 21:21:39 +00:00
|
|
|
if (strcasecmp(notifystr, "explicit") == 0)
|
|
|
|
notifytype = dns_notifytype_explicit;
|
2004-03-30 02:13:45 +00:00
|
|
|
else if (strcasecmp(notifystr, "master-only") == 0)
|
|
|
|
notifytype = dns_notifytype_masteronly;
|
2001-03-04 21:21:39 +00:00
|
|
|
else
|
|
|
|
INSIST(0);
|
|
|
|
}
|
2000-07-24 22:59:44 +00:00
|
|
|
dns_zone_setnotifytype(zone, notifytype);
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "also-notify", &obj);
|
2000-07-25 20:26:11 +00:00
|
|
|
if (result == ISC_R_SUCCESS) {
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_sockaddr_t *addrs = NULL;
|
2002-01-23 02:12:24 +00:00
|
|
|
isc_uint32_t addrcount;
|
2001-03-04 21:21:39 +00:00
|
|
|
result = ns_config_getiplist(config, obj, 0, mctx,
|
|
|
|
&addrs, &addrcount);
|
|
|
|
if (result != ISC_R_SUCCESS)
|
|
|
|
return (result);
|
|
|
|
result = dns_zone_setalsonotify(zone, addrs,
|
|
|
|
addrcount);
|
2002-01-23 02:12:24 +00:00
|
|
|
ns_config_putiplist(mctx, &addrs, addrcount);
|
2000-07-25 20:26:11 +00:00
|
|
|
if (result != ISC_R_SUCCESS)
|
|
|
|
return (result);
|
|
|
|
} else
|
2000-05-25 19:27:48 +00:00
|
|
|
RETERR(dns_zone_setalsonotify(zone, NULL, 0));
|
2000-08-01 01:33:37 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "notify-source", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-11-30 01:59:49 +00:00
|
|
|
RETERR(dns_zone_setnotifysrc4(zone, cfg_obj_assockaddr(obj)));
|
2004-01-05 06:56:44 +00:00
|
|
|
ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj));
|
2000-11-25 02:43:56 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "notify-source-v6", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-11-30 01:59:49 +00:00
|
|
|
RETERR(dns_zone_setnotifysrc6(zone, cfg_obj_assockaddr(obj)));
|
2004-01-05 06:56:44 +00:00
|
|
|
ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj));
|
2000-11-25 02:43:56 +00:00
|
|
|
|
2007-09-18 00:22:31 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "notify-to-soa", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_NOTIFYTOSOA,
|
|
|
|
cfg_obj_asboolean(obj));
|
|
|
|
|
2005-02-10 05:53:43 +00:00
|
|
|
dns_zone_setisself(zone, ns_client_isself, NULL);
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
RETERR(configure_zone_acl(zconfig, vconfig, config,
|
2008-05-21 23:17:21 +00:00
|
|
|
allow_transfer, ac, zone,
|
2000-05-25 19:27:48 +00:00
|
|
|
dns_zone_setxfracl,
|
|
|
|
dns_zone_clearxfracl));
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "max-transfer-time-out", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-06-04 21:51:27 +00:00
|
|
|
dns_zone_setmaxxfrout(zone, cfg_obj_asuint32(obj) * 60);
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "max-transfer-idle-out", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-06-04 21:51:27 +00:00
|
|
|
dns_zone_setidleout(zone, cfg_obj_asuint32(obj) * 60);
|
2001-08-30 05:23:00 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
2001-09-01 01:13:41 +00:00
|
|
|
result = ns_config_get(maps, "max-journal-size", &obj);
|
2001-09-01 01:43:24 +00:00
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setjournalsize(zone, -1);
|
|
|
|
if (cfg_obj_isstring(obj)) {
|
|
|
|
const char *str = cfg_obj_asstring(obj);
|
|
|
|
INSIST(strcasecmp(str, "unlimited") == 0);
|
|
|
|
journal_size = ISC_UINT32_MAX / 2;
|
|
|
|
} else {
|
|
|
|
isc_resourcevalue_t value;
|
|
|
|
value = cfg_obj_asuint64(obj);
|
|
|
|
if (value > ISC_UINT32_MAX / 2) {
|
|
|
|
cfg_obj_log(obj, ns_g_lctx,
|
|
|
|
ISC_LOG_ERROR,
|
|
|
|
"'max-journal-size "
|
2001-09-04 19:20:54 +00:00
|
|
|
"%" ISC_PRINT_QUADFORMAT "d' "
|
|
|
|
"is too large",
|
2001-09-01 01:43:24 +00:00
|
|
|
value);
|
|
|
|
RETERR(ISC_R_RANGE);
|
2001-08-30 05:23:00 +00:00
|
|
|
}
|
2001-09-01 01:43:24 +00:00
|
|
|
journal_size = (isc_uint32_t)value;
|
|
|
|
}
|
|
|
|
dns_zone_setjournalsize(zone, journal_size);
|
2001-09-08 00:21:49 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "ixfr-from-differences", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2004-10-14 00:49:34 +00:00
|
|
|
if (cfg_obj_isboolean(obj))
|
|
|
|
ixfrdiff = cfg_obj_asboolean(obj);
|
|
|
|
else if (strcasecmp(cfg_obj_asstring(obj), "master") &&
|
|
|
|
ztype == dns_zone_master)
|
|
|
|
ixfrdiff = ISC_TRUE;
|
|
|
|
else if (strcasecmp(cfg_obj_asstring(obj), "slave") &&
|
|
|
|
ztype == dns_zone_slave)
|
|
|
|
ixfrdiff = ISC_TRUE;
|
|
|
|
else
|
|
|
|
ixfrdiff = ISC_FALSE;
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_IXFRFROMDIFFS, ixfrdiff);
|
2004-02-27 20:41:51 +00:00
|
|
|
|
|
|
|
checknames(ztype, maps, &obj);
|
|
|
|
INSIST(obj != NULL);
|
|
|
|
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
|
|
|
|
fail = ISC_FALSE;
|
|
|
|
check = ISC_TRUE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
|
|
|
|
fail = check = ISC_TRUE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
|
|
|
|
fail = check = ISC_FALSE;
|
|
|
|
} else
|
|
|
|
INSIST(0);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKNAMES, check);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKNAMESFAIL, fail);
|
2005-01-11 23:10:06 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "notify-delay", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setnotifydelay(zone, cfg_obj_asuint32(obj));
|
|
|
|
|
2005-08-24 23:54:04 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "check-sibling", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2008-01-18 23:46:58 +00:00
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKSIBLING,
|
2005-08-24 23:54:04 +00:00
|
|
|
cfg_obj_asboolean(obj));
|
2006-01-05 02:19:02 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "zero-no-soa-ttl", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setzeronosoattl(zone, cfg_obj_asboolean(obj));
|
2008-09-24 02:46:23 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "nsec3-test-zone", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_NSEC3TESTZONE,
|
|
|
|
cfg_obj_asboolean(obj));
|
2000-05-25 19:27:48 +00:00
|
|
|
}
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2000-05-25 19:27:48 +00:00
|
|
|
/*
|
|
|
|
* Configure update-related options. These apply to
|
|
|
|
* primary masters only.
|
|
|
|
*/
|
2001-03-04 21:21:39 +00:00
|
|
|
if (ztype == dns_zone_master) {
|
2000-12-01 18:22:17 +00:00
|
|
|
dns_acl_t *updateacl;
|
2009-06-10 00:27:22 +00:00
|
|
|
|
2001-11-08 05:36:23 +00:00
|
|
|
RETERR(configure_zone_acl(zconfig, vconfig, config,
|
2008-05-21 23:17:21 +00:00
|
|
|
allow_update, ac, zone,
|
2000-05-25 19:27:48 +00:00
|
|
|
dns_zone_setupdateacl,
|
|
|
|
dns_zone_clearupdateacl));
|
2008-01-18 23:46:58 +00:00
|
|
|
|
2000-12-01 18:22:17 +00:00
|
|
|
updateacl = dns_zone_getupdateacl(zone);
|
|
|
|
if (updateacl != NULL && dns_acl_isinsecure(updateacl))
|
|
|
|
isc_log_write(ns_g_lctx, DNS_LOGCATEGORY_SECURITY,
|
|
|
|
NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
|
|
|
|
"zone '%s' allows updates by IP "
|
|
|
|
"address, which is insecure",
|
2001-03-04 21:21:39 +00:00
|
|
|
zname);
|
2008-01-18 23:46:58 +00:00
|
|
|
|
2009-07-14 22:54:57 +00:00
|
|
|
RETERR(configure_zone_ssutable(zoptions, zone, zname));
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "sig-validity-interval", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2008-04-02 02:37:42 +00:00
|
|
|
{
|
|
|
|
const cfg_obj_t *validity, *resign;
|
|
|
|
|
|
|
|
validity = cfg_tuple_get(obj, "validity");
|
|
|
|
seconds = cfg_obj_asuint32(validity) * 86400;
|
|
|
|
dns_zone_setsigvalidityinterval(zone, seconds);
|
|
|
|
|
|
|
|
resign = cfg_tuple_get(obj, "re-sign");
|
|
|
|
if (cfg_obj_isvoid(resign)) {
|
|
|
|
seconds /= 4;
|
|
|
|
} else {
|
|
|
|
if (seconds > 7 * 86400)
|
|
|
|
seconds = cfg_obj_asuint32(resign) *
|
|
|
|
86400;
|
|
|
|
else
|
|
|
|
seconds = cfg_obj_asuint32(resign) *
|
|
|
|
3600;
|
|
|
|
}
|
|
|
|
dns_zone_setsigresigninginterval(zone, seconds);
|
|
|
|
}
|
2002-01-21 11:00:25 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "key-directory", &obj);
|
|
|
|
if (result == ISC_R_SUCCESS) {
|
|
|
|
filename = cfg_obj_asstring(obj);
|
|
|
|
RETERR(dns_zone_setkeydirectory(zone, filename));
|
|
|
|
}
|
2005-05-19 04:59:05 +00:00
|
|
|
|
2008-04-02 02:37:42 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "sig-signing-signatures", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setsignatures(zone, cfg_obj_asuint32(obj));
|
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "sig-signing-nodes", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setnodes(zone, cfg_obj_asuint32(obj));
|
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "sig-signing-type", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setprivatetype(zone, cfg_obj_asuint32(obj));
|
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "update-check-ksk", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_UPDATECHECKKSK,
|
|
|
|
cfg_obj_asboolean(obj));
|
|
|
|
|
2009-10-10 01:48:00 +00:00
|
|
|
obj = NULL;
|
2009-12-03 23:18:17 +00:00
|
|
|
result = ns_config_get(maps, "dnssec-dnskey-kskonly", &obj);
|
2009-10-10 01:48:00 +00:00
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_DNSKEYKSKONLY,
|
|
|
|
cfg_obj_asboolean(obj));
|
2008-04-02 02:37:42 +00:00
|
|
|
} else if (ztype == dns_zone_slave) {
|
|
|
|
RETERR(configure_zone_acl(zconfig, vconfig, config,
|
2008-05-21 23:17:21 +00:00
|
|
|
allow_update_forwarding, ac, zone,
|
2008-04-02 02:37:42 +00:00
|
|
|
dns_zone_setforwardacl,
|
|
|
|
dns_zone_clearforwardacl));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*%
|
|
|
|
* Primary master functionality.
|
|
|
|
*/
|
|
|
|
if (ztype == dns_zone_master) {
|
2009-10-12 20:48:12 +00:00
|
|
|
isc_boolean_t allow = ISC_FALSE, maint = ISC_FALSE;
|
|
|
|
isc_boolean_t create = ISC_FALSE;
|
|
|
|
|
2005-01-09 23:40:04 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "check-wildcard", &obj);
|
|
|
|
if (result == ISC_R_SUCCESS)
|
|
|
|
check = cfg_obj_asboolean(obj);
|
|
|
|
else
|
|
|
|
check = ISC_FALSE;
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKWILDCARD, check);
|
2005-05-19 04:59:05 +00:00
|
|
|
|
2009-12-04 21:09:34 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "check-dup-records", &obj);
|
|
|
|
INSIST(obj != NULL);
|
|
|
|
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
|
|
|
|
fail = ISC_FALSE;
|
|
|
|
check = ISC_TRUE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
|
|
|
|
fail = check = ISC_TRUE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
|
|
|
|
fail = check = ISC_FALSE;
|
|
|
|
} else
|
|
|
|
INSIST(0);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKDUPRR, check);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKDUPRRFAIL, fail);
|
|
|
|
|
2005-05-19 04:59:05 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "check-mx", &obj);
|
|
|
|
INSIST(obj != NULL);
|
|
|
|
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
|
|
|
|
fail = ISC_FALSE;
|
|
|
|
check = ISC_TRUE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
|
|
|
|
fail = check = ISC_TRUE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
|
|
|
|
fail = check = ISC_FALSE;
|
|
|
|
} else
|
|
|
|
INSIST(0);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKMX, check);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKMXFAIL, fail);
|
|
|
|
|
|
|
|
obj = NULL;
|
2005-08-24 23:54:04 +00:00
|
|
|
result = ns_config_get(maps, "check-integrity", &obj);
|
2005-05-19 04:59:05 +00:00
|
|
|
INSIST(obj != NULL);
|
2008-01-18 23:46:58 +00:00
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKINTEGRITY,
|
2005-05-19 04:59:05 +00:00
|
|
|
cfg_obj_asboolean(obj));
|
2006-01-05 23:45:34 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "check-mx-cname", &obj);
|
|
|
|
INSIST(obj != NULL);
|
|
|
|
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
|
|
|
|
warn = ISC_TRUE;
|
|
|
|
ignore = ISC_FALSE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
|
|
|
|
warn = ignore = ISC_FALSE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
|
|
|
|
warn = ignore = ISC_TRUE;
|
|
|
|
} else
|
|
|
|
INSIST(0);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_WARNMXCNAME, warn);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_IGNOREMXCNAME, ignore);
|
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "check-srv-cname", &obj);
|
|
|
|
INSIST(obj != NULL);
|
|
|
|
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
|
|
|
|
warn = ISC_TRUE;
|
|
|
|
ignore = ISC_FALSE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
|
|
|
|
warn = ignore = ISC_FALSE;
|
|
|
|
} else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
|
|
|
|
warn = ignore = ISC_TRUE;
|
|
|
|
} else
|
|
|
|
INSIST(0);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_WARNSRVCNAME, warn);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_IGNORESRVCNAME, ignore);
|
2009-10-08 23:13:07 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
2009-12-03 23:18:17 +00:00
|
|
|
result = ns_config_get(maps, "dnssec-secure-to-insecure", &obj);
|
2009-10-08 23:13:07 +00:00
|
|
|
INSIST(obj != NULL);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_SECURETOINSECURE,
|
|
|
|
cfg_obj_asboolean(obj));
|
2009-10-12 20:48:12 +00:00
|
|
|
|
2009-10-12 23:48:02 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = cfg_map_get(zoptions, "auto-dnssec", &obj);
|
|
|
|
if (result == ISC_R_SUCCESS) {
|
|
|
|
const char *arg = cfg_obj_asstring(obj);
|
|
|
|
if (strcasecmp(arg, "allow") == 0)
|
|
|
|
allow = ISC_TRUE;
|
|
|
|
else if (strcasecmp(arg, "maintain") == 0)
|
|
|
|
allow = maint = ISC_TRUE;
|
|
|
|
else if (strcasecmp(arg, "create") == 0)
|
|
|
|
allow = maint = create = ISC_TRUE;
|
|
|
|
else if (strcasecmp(arg, "off") == 0)
|
|
|
|
;
|
|
|
|
else
|
|
|
|
INSIST(0);
|
|
|
|
dns_zone_setkeyopt(zone, DNS_ZONEKEY_ALLOW, allow);
|
|
|
|
dns_zone_setkeyopt(zone, DNS_ZONEKEY_MAINTAIN, maint);
|
|
|
|
dns_zone_setkeyopt(zone, DNS_ZONEKEY_CREATE, create);
|
|
|
|
}
|
2000-05-25 19:27:48 +00:00
|
|
|
}
|
2000-03-06 19:06:07 +00:00
|
|
|
|
2000-05-25 19:27:48 +00:00
|
|
|
/*
|
|
|
|
* Configure slave functionality.
|
|
|
|
*/
|
2001-03-04 21:21:39 +00:00
|
|
|
switch (ztype) {
|
|
|
|
case dns_zone_slave:
|
|
|
|
case dns_zone_stub:
|
2005-11-30 03:33:49 +00:00
|
|
|
count = 0;
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = cfg_map_get(zoptions, "masters", &obj);
|
|
|
|
if (obj != NULL) {
|
|
|
|
addrs = NULL;
|
|
|
|
keynames = NULL;
|
|
|
|
RETERR(ns_config_getipandkeylist(config, obj, mctx,
|
|
|
|
&addrs, &keynames,
|
|
|
|
&count));
|
|
|
|
result = dns_zone_setmasterswithkeys(zone, addrs,
|
|
|
|
keynames, count);
|
|
|
|
ns_config_putipandkeylist(mctx, &addrs, &keynames,
|
|
|
|
count);
|
2001-01-25 02:33:53 +00:00
|
|
|
} else
|
2000-04-28 00:58:42 +00:00
|
|
|
result = dns_zone_setmasters(zone, NULL, 0);
|
2000-05-25 19:27:48 +00:00
|
|
|
RETERR(result);
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2002-07-29 06:58:46 +00:00
|
|
|
multi = ISC_FALSE;
|
|
|
|
if (count > 1) {
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "multi-master", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
multi = cfg_obj_asboolean(obj);
|
|
|
|
}
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_MULTIMASTER, multi);
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "max-transfer-time-in", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-06-04 21:51:27 +00:00
|
|
|
dns_zone_setmaxxfrin(zone, cfg_obj_asuint32(obj) * 60);
|
2000-01-31 19:53:14 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "max-transfer-idle-in", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-06-04 21:51:27 +00:00
|
|
|
dns_zone_setidlein(zone, cfg_obj_asuint32(obj) * 60);
|
1999-12-16 23:11:07 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "max-refresh-time", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setmaxrefreshtime(zone, cfg_obj_asuint32(obj));
|
2000-08-02 22:29:16 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "min-refresh-time", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setminrefreshtime(zone, cfg_obj_asuint32(obj));
|
2000-08-02 22:29:16 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "max-retry-time", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setmaxretrytime(zone, cfg_obj_asuint32(obj));
|
2000-08-02 22:29:16 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "min-retry-time", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
dns_zone_setminretrytime(zone, cfg_obj_asuint32(obj));
|
2000-08-02 22:29:16 +00:00
|
|
|
|
2001-10-11 01:55:03 +00:00
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "transfer-source", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-11-30 01:59:49 +00:00
|
|
|
RETERR(dns_zone_setxfrsource4(zone, cfg_obj_assockaddr(obj)));
|
2004-01-05 06:56:44 +00:00
|
|
|
ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj));
|
2001-10-11 01:55:03 +00:00
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "transfer-source-v6", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2001-11-30 01:59:49 +00:00
|
|
|
RETERR(dns_zone_setxfrsource6(zone, cfg_obj_assockaddr(obj)));
|
2004-01-05 06:56:44 +00:00
|
|
|
ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj));
|
2001-10-11 01:55:03 +00:00
|
|
|
|
2003-02-26 23:29:00 +00:00
|
|
|
obj = NULL;
|
2003-02-27 05:12:47 +00:00
|
|
|
result = ns_config_get(maps, "alt-transfer-source", &obj);
|
2003-02-26 23:29:00 +00:00
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
RETERR(dns_zone_setaltxfrsource4(zone, cfg_obj_assockaddr(obj)));
|
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
result = ns_config_get(maps, "alt-transfer-source-v6", &obj);
|
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
|
|
|
RETERR(dns_zone_setaltxfrsource6(zone, cfg_obj_assockaddr(obj)));
|
|
|
|
|
|
|
|
obj = NULL;
|
|
|
|
(void)ns_config_get(maps, "use-alt-transfer-source", &obj);
|
|
|
|
if (obj == NULL) {
|
|
|
|
/*
|
|
|
|
* Default off when views are in use otherwise
|
2003-08-08 22:46:37 +00:00
|
|
|
* on for BIND 8 compatibility.
|
2003-02-26 23:29:00 +00:00
|
|
|
*/
|
|
|
|
view = dns_zone_getview(zone);
|
|
|
|
if (view != NULL && strcmp(view->name, "_default") == 0)
|
|
|
|
alt = ISC_TRUE;
|
|
|
|
else
|
|
|
|
alt = ISC_FALSE;
|
|
|
|
} else
|
|
|
|
alt = cfg_obj_asboolean(obj);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_USEALTXFRSRC, alt);
|
|
|
|
|
2006-06-04 23:17:07 +00:00
|
|
|
obj = NULL;
|
|
|
|
(void)ns_config_get(maps, "try-tcp-refresh", &obj);
|
|
|
|
dns_zone_setoption(zone, DNS_ZONEOPT_TRYTCPREFRESH,
|
|
|
|
cfg_obj_asboolean(obj));
|
1999-12-16 23:11:07 +00:00
|
|
|
break;
|
2000-08-01 01:33:37 +00:00
|
|
|
|
2000-05-25 19:27:48 +00:00
|
|
|
default:
|
|
|
|
break;
|
1999-12-16 23:11:07 +00:00
|
|
|
}
|
|
|
|
|
2000-04-06 22:03:35 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
1999-12-16 23:11:07 +00:00
|
|
|
}
|
|
|
|
|
2000-01-21 19:22:35 +00:00
|
|
|
isc_boolean_t
|
2006-02-28 02:39:52 +00:00
|
|
|
ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig) {
|
|
|
|
const cfg_obj_t *zoptions = NULL;
|
|
|
|
const cfg_obj_t *obj = NULL;
|
2000-01-21 19:22:35 +00:00
|
|
|
const char *cfilename;
|
|
|
|
const char *zfilename;
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
zoptions = cfg_tuple_get(zconfig, "options");
|
|
|
|
|
|
|
|
if (zonetype_fromconfig(zoptions) != dns_zone_gettype(zone))
|
2000-01-21 19:22:35 +00:00
|
|
|
return (ISC_FALSE);
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
obj = NULL;
|
|
|
|
(void)cfg_map_get(zoptions, "file", &obj);
|
|
|
|
if (obj != NULL)
|
|
|
|
cfilename = cfg_obj_asstring(obj);
|
|
|
|
else
|
|
|
|
cfilename = NULL;
|
2000-11-18 00:57:23 +00:00
|
|
|
zfilename = dns_zone_getfile(zone);
|
2001-09-25 23:01:15 +00:00
|
|
|
if (!((cfilename == NULL && zfilename == NULL) ||
|
2001-10-17 18:57:01 +00:00
|
|
|
(cfilename != NULL && zfilename != NULL &&
|
2001-09-25 23:01:15 +00:00
|
|
|
strcmp(cfilename, zfilename) == 0)))
|
|
|
|
return (ISC_FALSE);
|
2000-01-21 19:22:35 +00:00
|
|
|
|
|
|
|
return (ISC_TRUE);
|
|
|
|
}
|