summaryrefslogtreecommitdiff
path: root/lib/isccfg/namedconf.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/isccfg/namedconf.c')
-rw-r--r--lib/isccfg/namedconf.c119
1 files changed, 96 insertions, 23 deletions
diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c
index 0787ec5e0ddcd..d95a03a614331 100644
--- a/lib/isccfg/namedconf.c
+++ b/lib/isccfg/namedconf.c
@@ -53,7 +53,8 @@ parse_enum_or_other(cfg_parser_t *pctx, const cfg_type_t *enumtype,
const cfg_type_t *othertype, cfg_obj_t **ret);
static void
-doc_enum_or_other(cfg_printer_t *pctx, const cfg_type_t *type);
+doc_enum_or_other(cfg_printer_t *pctx, const cfg_type_t *enumtype,
+ const cfg_type_t *othertype);
static isc_result_t
parse_keyvalue(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
@@ -553,8 +554,12 @@ static isc_result_t
parse_zonestat(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
return (parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
}
+static void
+doc_zonestat(cfg_printer_t *pctx, const cfg_type_t *type) {
+ doc_enum_or_other(pctx, type, &cfg_type_boolean);
+}
static cfg_type_t cfg_type_zonestat = {
- "zonestat", parse_zonestat, cfg_print_ustring, doc_enum_or_other,
+ "zonestat", parse_zonestat, cfg_print_ustring, doc_zonestat,
&cfg_rep_string, zonestat_enums
};
@@ -769,13 +774,18 @@ static cfg_type_t cfg_type_serverid = {
/*%
* Port list.
*/
+static void
+print_porttuple(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+ cfg_print_cstr(pctx, "range ");
+ cfg_print_tuple(pctx, obj);
+}
static cfg_tuplefielddef_t porttuple_fields[] = {
{ "loport", &cfg_type_uint32, 0 },
{ "hiport", &cfg_type_uint32, 0 },
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_porttuple = {
- "porttuple", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ "porttuple", cfg_parse_tuple, print_porttuple, cfg_doc_tuple,
&cfg_rep_tuple, porttuple_fields
};
@@ -845,7 +855,6 @@ static cfg_type_t cfg_type_bracketed_portlist = {
&cfg_rep_list, &cfg_type_portrange
};
-#ifdef ENABLE_FETCHLIMIT
/*%
* fetch-quota-params
*/
@@ -876,8 +885,7 @@ parse_optional_response(cfg_parser_t *pctx, const cfg_type_t *type,
static void
doc_optional_response(cfg_printer_t *pctx, const cfg_type_t *type) {
- UNUSED(type);
- cfg_print_cstr(pctx, "[ ( drop | fail ) ]");
+ doc_enum_or_other(pctx, type, &cfg_type_void);
}
static cfg_type_t cfg_type_responsetype = {
@@ -895,7 +903,6 @@ static cfg_type_t cfg_type_fetchesper = {
"fetchesper", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
&cfg_rep_tuple, fetchesper_fields
};
-#endif /* ENABLE_FETCHLIMIT */
/*%
* Clauses that can be found within the top level of the named.conf
@@ -1001,7 +1008,7 @@ options_clauses[] = {
{ "transfers-out", &cfg_type_uint32, 0 },
{ "treat-cr-as-space", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "use-id-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
- { "use-ixfr", &cfg_type_boolean, 0 },
+ { "use-ixfr", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "use-v4-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "use-v6-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "version", &cfg_type_qstringornone, 0 },
@@ -1443,6 +1450,10 @@ view_clauses[] = {
{ "fetch-quota-params", &cfg_type_fetchquota, 0 },
{ "fetches-per-server", &cfg_type_fetchesper, 0 },
{ "fetches-per-zone", &cfg_type_fetchesper, 0 },
+#else
+ { "fetch-quota-params", &cfg_type_fetchquota, CFG_CLAUSEFLAG_NOTCONFIGURED },
+ { "fetches-per-server", &cfg_type_fetchesper, CFG_CLAUSEFLAG_NOTCONFIGURED },
+ { "fetches-per-zone", &cfg_type_fetchesper, CFG_CLAUSEFLAG_NOTCONFIGURED },
#endif /* ENABLE_FETCHLIMIT */
{ "ixfr-from-differences", &cfg_type_ixfrdifftype, 0 },
{ "lame-ttl", &cfg_type_uint32, 0 },
@@ -1964,9 +1975,14 @@ parse_size(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
return (parse_enum_or_other(pctx, type, &cfg_type_sizeval, ret));
}
+static void
+doc_size(cfg_printer_t *pctx, const cfg_type_t *type) {
+ doc_enum_or_other(pctx, type, &cfg_type_sizeval);
+}
+
static const char *size_enums[] = { "unlimited", "default", NULL };
static cfg_type_t cfg_type_size = {
- "size", parse_size, cfg_print_ustring, cfg_doc_terminal,
+ "size", parse_size, cfg_print_ustring, doc_size,
&cfg_rep_string, size_enums
};
@@ -2028,12 +2044,34 @@ parse_enum_or_other(cfg_parser_t *pctx, const cfg_type_t *enumtype,
}
static void
-doc_enum_or_other(cfg_printer_t *pctx, const cfg_type_t *type) {
- cfg_doc_terminal(pctx, type);
-#if 0 /* XXX */
- cfg_print_chars(pctx, "( ", 2);...
-#endif
+doc_enum_or_other(cfg_printer_t *pctx, const cfg_type_t *enumtype,
+ const cfg_type_t *othertype)
+{
+ const char * const *p;
+ isc_boolean_t first = ISC_TRUE;
+ /*
+ * If othertype is cfg_type_void, it means that enumtype is
+ * optional.
+ */
+
+ if (othertype == &cfg_type_void)
+ cfg_print_cstr(pctx, "[ ");
+ cfg_print_cstr(pctx, "( ");
+ for (p = enumtype->of; *p != NULL; p++) {
+ if (!first)
+ cfg_print_cstr(pctx, " | ");
+ first = ISC_FALSE;
+ cfg_print_cstr(pctx, *p);
+ }
+ if (othertype != &cfg_type_void) {
+ if (!first)
+ cfg_print_cstr(pctx, " | ");
+ cfg_doc_terminal(pctx, othertype);
+ }
+ cfg_print_cstr(pctx, " )");
+ if (othertype == &cfg_type_void)
+ cfg_print_cstr(pctx, " ]");
}
static isc_result_t
@@ -2078,8 +2116,12 @@ static isc_result_t
parse_dialup_type(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
return (parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
}
+static void
+doc_dialup_type(cfg_printer_t *pctx, const cfg_type_t *type) {
+ doc_enum_or_other(pctx, type, &cfg_type_boolean);
+}
static cfg_type_t cfg_type_dialuptype = {
- "dialuptype", parse_dialup_type, cfg_print_ustring, doc_enum_or_other,
+ "dialuptype", parse_dialup_type, cfg_print_ustring, doc_dialup_type,
&cfg_rep_string, dialup_enums
};
@@ -2088,18 +2130,28 @@ static isc_result_t
parse_notify_type(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
return (parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
}
+static void
+doc_notify_type(cfg_printer_t *pctx, const cfg_type_t *type) {
+ doc_enum_or_other(pctx, type, &cfg_type_boolean);
+}
static cfg_type_t cfg_type_notifytype = {
- "notifytype", parse_notify_type, cfg_print_ustring, doc_enum_or_other,
+ "notifytype", parse_notify_type, cfg_print_ustring, doc_notify_type,
&cfg_rep_string, notify_enums,
};
static const char *ixfrdiff_enums[] = { "master", "slave", NULL };
static isc_result_t
-parse_ixfrdiff_type(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
+parse_ixfrdiff_type(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret)
+{
return (parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
}
+static void
+doc_ixfrdiff_type(cfg_printer_t *pctx, const cfg_type_t *type) {
+ doc_enum_or_other(pctx, type, &cfg_type_boolean);
+}
static cfg_type_t cfg_type_ixfrdifftype = {
- "ixfrdiff", parse_ixfrdiff_type, cfg_print_ustring, doc_enum_or_other,
+ "ixfrdiff", parse_ixfrdiff_type, cfg_print_ustring, doc_ixfrdiff_type,
&cfg_rep_string, ixfrdiff_enums,
};
@@ -2109,9 +2161,13 @@ parse_v4_aaaa(cfg_parser_t *pctx, const cfg_type_t *type,
cfg_obj_t **ret) {
return (parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
}
+static void
+doc_v4_aaaa(cfg_printer_t *pctx, const cfg_type_t *type) {
+ doc_enum_or_other(pctx, type, &cfg_type_boolean);
+}
static cfg_type_t cfg_type_v4_aaaa = {
"v4_aaaa", parse_v4_aaaa, cfg_print_ustring,
- doc_enum_or_other, &cfg_rep_string, v4_aaaa_enums,
+ doc_v4_aaaa, &cfg_rep_string, v4_aaaa_enums,
};
static keyword_type_t key_kw = { "key", &cfg_type_astring };
@@ -2281,8 +2337,14 @@ parse_optional_class(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret
return (result);
}
+static void
+doc_optional_class(cfg_printer_t *pctx, const cfg_type_t *type) {
+ UNUSED(type);
+ cfg_print_cstr(pctx, "[ <class> ]");
+}
+
static cfg_type_t cfg_type_optional_class = {
- "optional_class", parse_optional_class, NULL, cfg_doc_terminal,
+ "optional_class", parse_optional_class, NULL, doc_optional_class,
NULL, NULL
};
@@ -2531,9 +2593,15 @@ parse_optional_facility(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **
return (result);
}
+static void
+doc_optional_facility(cfg_printer_t *pctx, const cfg_type_t *type) {
+ UNUSED(type);
+ cfg_print_cstr(pctx, "[ <syslog_facility> ]");
+}
+
static cfg_type_t cfg_type_optional_facility = {
- "optional_facility", parse_optional_facility, NULL, cfg_doc_terminal,
- NULL, NULL };
+ "optional_facility", parse_optional_facility, NULL,
+ doc_optional_facility, NULL, NULL };
/*%
@@ -2592,8 +2660,13 @@ parse_logversions(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
return (parse_enum_or_other(pctx, type, &cfg_type_uint32, ret));
}
+static void
+doc_logversions(cfg_printer_t *pctx, const cfg_type_t *type) {
+ doc_enum_or_other(pctx, type, &cfg_type_uint32);
+}
+
static cfg_type_t cfg_type_logversions = {
- "logversions", parse_logversions, cfg_print_ustring, cfg_doc_terminal,
+ "logversions", parse_logversions, cfg_print_ustring, doc_logversions,
&cfg_rep_string, logversions_enums
};