check.c revision 1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6
/*
* Copyright (C) 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
* INTERNET SOFTWARE CONSORTIUM 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.
*/
/* $Id: check.c,v 1.10 2001/11/30 01:59:02 gson Exp $ */
#include <config.h>
#include <stdlib.h>
#include <string.h>
#include <dns/rdataclass.h>
static isc_result_t
"no matching 'forwarders' statement");
return (ISC_R_FAILURE);
}
return (ISC_R_SUCCESS);
}
typedef struct {
const char *name;
unsigned int scale;
unsigned int max;
static isc_result_t
unsigned int i;
static intervaltable intervals[] = {
{ "cleaning-interval", 60, 28 * 24 * 60 }, /* 28 days */
{ "heartbeat-interval", 60, 28 * 24 * 60 }, /* 28 days */
{ "interface-interval", 60, 28 * 24 * 60 }, /* 28 days */
{ "max-transfer-idle-in", 60, 28 * 24 * 60 }, /* 28 days */
{ "max-transfer-idle-out", 60, 28 * 24 * 60 }, /* 28 days */
{ "max-transfer-time-in", 60, 28 * 24 * 60 }, /* 28 days */
{ "max-transfer-time-out", 60, 28 * 24 * 60 }, /* 28 days */
{ "sig-validity-interval", 86400, 10 * 366 }, /* 10 years */
{ "statistics-interval", 60, 28 * 24 * 60 }, /* 28 days */
};
/*
* Check that fields specified in units of time other than seconds
* have reasonable values.
*/
continue;
"%s '%u' is out of range (0..%u)",
"%s '%d' is out of range",
}
}
return (result);
}
#define MASTERZONE 1
#define SLAVEZONE 2
#define STUBZONE 4
#define HINTZONE 8
#define FORWARDZONE 16
typedef struct {
const char *name;
int allowed;
} optionstable;
static isc_result_t
{
const char *zname;
const char *typestr;
unsigned int ztype;
unsigned int i;
static optionstable options[] = {
{ "sig-validity-interval", MASTERZONE },
{ "allow-update", MASTERZONE },
{ "allow-update-forwarding", SLAVEZONE },
{ "update-policy", MASTERZONE },
};
static optionstable dialups[] = {
{ "notify-passive", SLAVEZONE },
};
"zone '%s': type not present", zname);
return (ISC_R_FAILURE);
}
ztype = MASTERZONE;
ztype = FORWARDZONE;
else {
"zone '%s': invalid type %s",
return (ISC_R_FAILURE);
}
if (cfg_obj_isstring(obj)) {
if (result != ISC_R_SUCCESS) {
"zone '%s': invalid class %s",
return (ISC_R_FAILURE);
}
"zone '%s': class '%s' does not "
return (ISC_R_FAILURE);
}
}
/*
* Look for an already existing zone.
*/
if (tresult == ISC_R_EXISTS) {
"zone '%s': already exists ", zname);
} else if (tresult != ISC_R_SUCCESS)
return (tresult);
/*
* Look for inappropriate options for the given zone type.
*/
{
"option '%s' is not allowed in '%s' "
"zone '%s'",
}
}
/*
* Slave & stub zones must have a "masters" field.
*/
"zone '%s': missing 'masters' entry",
zname);
}
}
/*
* Master zones can't have both "allow-update" and "update-policy".
*/
if (ztype == MASTERZONE) {
"zone '%s': 'allow-update' is ignored "
"when 'update-policy' is present",
zname);
}
}
/*
* Check the excessively complicated "dialup" option.
*/
for (i = 0;
i++)
{
continue;
"dialup type '%s' is not "
"allowed in '%s' "
"zone '%s'",
}
break;
}
"invalid dialup type '%s' in zone "
}
}
}
/*
* Check that forwarding is reasonable.
*/
/*
* Check various options.
*/
if (tresult != ISC_R_SUCCESS)
return (result);
}
"key '%s' must have both 'secret' and "
"'algorithm' defined",
keyname);
return (ISC_R_FAILURE);
}
return (ISC_R_SUCCESS);
}
static isc_result_t
{
if (tresult == ISC_R_EXISTS) {
"key '%s': already exists ", keyname);
} else if (tresult != ISC_R_SUCCESS)
return (tresult);
if (tresult != ISC_R_SUCCESS)
return (tresult);
}
return (result);
}
static isc_result_t
{
/*
* Check that all zone statements are syntactically correct and
* there are no duplicate zones.
*/
if (tresult != ISC_R_SUCCESS)
return (ISC_R_NOMEMORY);
else
{
if (tresult != ISC_R_SUCCESS)
}
/*
* Check that all key statements are syntactically correct and
* there are no duplicate keys.
*/
if (tresult != ISC_R_SUCCESS)
return (ISC_R_NOMEMORY);
if (tresult == ISC_R_EXISTS)
else if (tresult != ISC_R_SUCCESS) {
return (tresult);
}
if (tresult == ISC_R_EXISTS)
else if (tresult != ISC_R_SUCCESS) {
return (tresult);
}
}
/*
* Check that forwarding is reasonable.
*/
} else {
}
else
if (tresult != ISC_R_SUCCESS)
return (result);
}
} else {
"when using 'view' statements, "
"all zones must be in views");
}
}
{
if (cfg_obj_isstring(vclassobj)) {
if (tresult != ISC_R_SUCCESS)
"view '%s': invalid class %s",
}
if (tresult == ISC_R_SUCCESS)
if (tresult != ISC_R_SUCCESS)
}
if (tresult == ISC_R_SUCCESS) {
"'cache-file' cannot be a global "
"option if views are present");
}
}
return (result);
}