1018
1018
* response-policy {
1019
* zone <string> [ policy (given|no-op|nxdomain|nodata|cname <domain> ) ];
1022
* this is a chimera of doc_optional_keyvalue() and cfg_doc_enum()
1019
* zone <string> [ policy (given|disabled|passthru|
1020
* nxdomain|nodata|cname <domain> ) ]
1021
* [ recursive-only yes|no ]
1022
* [ max-policy-ttl number ] ;
1023
* } [ recursive-only yes|no ] [ break-dnssec yes|no ]
1024
* [ max-policy-ttl number ] ;
1025
doc_rpz_policies(cfg_printer_t *pctx, const cfg_type_t *type) {
1026
const keyword_type_t *kw;
1028
doc_rpz_policy(cfg_printer_t *pctx, const cfg_type_t *type) {
1027
1029
const char * const *p;
1030
cfg_print_chars(pctx, "[ ", 2);
1031
cfg_print_cstr(pctx, kw->name);
1032
cfg_print_chars(pctx, " ", 1);
1031
* This is cfg_doc_enum() without the trailing " )".
1034
1033
cfg_print_chars(pctx, "( ", 2);
1035
for (p = kw->type->of; *p != NULL; p++) {
1034
for (p = type->of; *p != NULL; p++) {
1036
1035
cfg_print_cstr(pctx, *p);
1037
1036
if (p[1] != NULL)
1038
1037
cfg_print_chars(pctx, " | ", 3);
1043
* print_qstring() from parser.c
1046
print_rpz_cname(cfg_printer_t *pctx, const cfg_obj_t *obj)
1048
cfg_print_chars(pctx, "\"", 1);
1049
cfg_print_ustring(pctx, obj);
1050
cfg_print_chars(pctx, "\"", 1);
1054
1042
doc_rpz_cname(cfg_printer_t *pctx, const cfg_type_t *type) {
1055
1043
cfg_doc_terminal(pctx, type);
1056
cfg_print_chars(pctx, " ) ]", 4);
1044
cfg_print_chars(pctx, " )", 2);
1049
* given|disabled|passthru|nxdomain|nodata|cname <domain>
1059
1051
static isc_result_t
1060
parse_rpz(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1052
cfg_parse_rpz_policy(cfg_parser_t *pctx, const cfg_type_t *type,
1061
1055
isc_result_t result;
1062
cfg_obj_t *obj = NULL;
1063
const cfg_tuplefielddef_t *fields = type->of;
1057
const cfg_tuplefielddef_t *fields;
1065
1059
CHECK(cfg_create_tuple(pctx, type, &obj));
1066
1062
CHECK(cfg_parse_obj(pctx, fields[0].type, &obj->value.tuple[0]));
1067
CHECK(cfg_parse_obj(pctx, fields[1].type, &obj->value.tuple[1]));
1069
1064
* parse cname domain only after "policy cname"
1071
if (cfg_obj_isvoid(obj->value.tuple[1]) ||
1072
strcasecmp("cname", cfg_obj_asstring(obj->value.tuple[1]))) {
1073
CHECK(cfg_parse_void(pctx, NULL, &obj->value.tuple[2]));
1066
if (strcasecmp("cname", cfg_obj_asstring(obj->value.tuple[0])) != 0) {
1067
CHECK(cfg_parse_void(pctx, NULL, &obj->value.tuple[1]));
1075
CHECK(cfg_parse_obj(pctx, fields[2].type, &obj->value.tuple[2]));
1079
return (ISC_R_SUCCESS);
1069
CHECK(cfg_parse_obj(pctx, fields[1].type,
1070
&obj->value.tuple[1]));
1074
return (ISC_R_SUCCESS);
1082
* Parse a tuple consisting of any kind of required field followed
1083
* by 2 or more optional keyvalues that can be in any order.
1086
cfg_parse_kv_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1087
const cfg_tuplefielddef_t *fields, *f;
1090
isc_result_t result;
1093
CHECK(cfg_create_tuple(pctx, type, &obj));
1096
* The zone first field is required and always first.
1099
CHECK(cfg_parse_obj(pctx, fields[0].type, &obj->value.tuple[0]));
1102
CHECK(cfg_peektoken(pctx, CFG_LEXOPT_QSTRING));
1103
if (pctx->token.type != isc_tokentype_string)
1106
for (fn = 1, f = &fields[1]; ; ++fn, ++f) {
1107
if (f->name == NULL) {
1108
cfg_parser_error(pctx, 0, "unexpected '%s'",
1109
TOKEN_STRING(pctx));
1110
result = ISC_R_UNEXPECTEDTOKEN;
1113
if (obj->value.tuple[fn] == NULL &&
1114
strcasecmp(f->name, TOKEN_STRING(pctx)) == 0)
1118
CHECK(cfg_gettoken(pctx, 0));
1119
CHECK(cfg_parse_obj(pctx, f->type, &obj->value.tuple[fn]));
1122
for (fn = 1, f = &fields[1]; f->name != NULL; ++fn, ++f) {
1123
if (obj->value.tuple[fn] == NULL)
1124
CHECK(cfg_parse_void(pctx, NULL,
1125
&obj->value.tuple[fn]));
1129
return (ISC_R_SUCCESS);
1137
cfg_print_kv_tuple(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1139
const cfg_tuplefielddef_t *fields, *f;
1140
const cfg_obj_t *fieldobj;
1142
fields = obj->type->of;
1143
for (f = fields, i = 0; f->name != NULL; f++, i++) {
1144
fieldobj = obj->value.tuple[i];
1145
if (fieldobj->type->print == cfg_print_void)
1148
cfg_print_chars(pctx, " ", 1);
1149
cfg_print_cstr(pctx, f->name);
1150
cfg_print_chars(pctx, " ", 1);
1152
cfg_print_obj(pctx, fieldobj);
1157
cfg_doc_kv_tuple(cfg_printer_t *pctx, const cfg_type_t *type) {
1158
const cfg_tuplefielddef_t *fields, *f;
1161
for (f = fields; f->name != NULL; f++) {
1163
cfg_print_chars(pctx, " [ ", 3);
1164
cfg_print_cstr(pctx, f->name);
1165
if (f->type->doc != cfg_doc_void)
1166
cfg_print_chars(pctx, " ", 1);
1168
cfg_doc_obj(pctx, f->type);
1170
cfg_print_chars(pctx, " ]", 2);
1174
static keyword_type_t zone_kw = {"zone", &cfg_type_qstring};
1175
static cfg_type_t cfg_type_rpz_zone = {
1176
"zone", parse_keyvalue, print_keyvalue,
1177
doc_keyvalue, &cfg_rep_string,
1086
1180
static const char *rpz_policies[] = {
1087
"given", "no-op", "nxdomain", "nodata", "cname", NULL
1089
static cfg_type_t cfg_type_rpz_policylist = {
1090
"policies", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
1091
&cfg_rep_string, &rpz_policies
1093
static keyword_type_t rpz_policies_kw = {
1094
"policy", &cfg_type_rpz_policylist
1181
"given", "disabled", "passthru", "no-op", "nxdomain", "nodata",
1184
static cfg_type_t cfg_type_rpz_policy_name = {
1185
"policy name", cfg_parse_enum, cfg_print_ustring,
1186
doc_rpz_policy, &cfg_rep_string,
1189
static cfg_type_t cfg_type_rpz_cname = {
1190
"quoted_string", cfg_parse_astring, NULL,
1191
doc_rpz_cname, &cfg_rep_string,
1194
static cfg_tuplefielddef_t rpz_policy_fields[] = {
1195
{ "policy name", &cfg_type_rpz_policy_name, 0 },
1196
{ "cname", &cfg_type_rpz_cname, 0 },
1096
1199
static cfg_type_t cfg_type_rpz_policy = {
1097
"optional_policy", parse_optional_keyvalue, print_keyvalue,
1098
doc_rpz_policies, &cfg_rep_string, &rpz_policies_kw
1100
static cfg_type_t cfg_type_cname = {
1101
"domain", cfg_parse_astring, print_rpz_cname, doc_rpz_cname,
1102
&cfg_rep_string, NULL
1104
static cfg_tuplefielddef_t rpzone_fields[] = {
1105
{ "name", &cfg_type_astring, 0 },
1200
"policy tuple", cfg_parse_rpz_policy,
1201
cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple,
1204
static cfg_tuplefielddef_t rpz_zone_fields[] = {
1205
{ "zone name", &cfg_type_rpz_zone, 0 },
1106
1206
{ "policy", &cfg_type_rpz_policy, 0 },
1107
{ "cname", &cfg_type_cname, 0 },
1110
static cfg_type_t cfg_type_rpzone = {
1111
"rpzone", parse_rpz, cfg_print_tuple, cfg_doc_tuple,
1112
&cfg_rep_tuple, rpzone_fields
1114
static cfg_clausedef_t rpz_clauses[] = {
1115
{ "zone", &cfg_type_rpzone, CFG_CLAUSEFLAG_MULTI },
1118
static cfg_clausedef_t *rpz_clausesets[] = {
1207
{ "recursive-only", &cfg_type_boolean, 0 },
1208
{ "max-policy-ttl", &cfg_type_uint32, 0 },
1211
static cfg_type_t cfg_type_rpz_tuple = {
1212
"rpz tuple", cfg_parse_kv_tuple,
1213
cfg_print_kv_tuple, cfg_doc_kv_tuple, &cfg_rep_tuple,
1216
static cfg_type_t cfg_type_rpz_list = {
1217
"zone list", cfg_parse_bracketed_list, cfg_print_bracketed_list,
1218
cfg_doc_bracketed_list, &cfg_rep_list,
1221
static cfg_tuplefielddef_t rpz_fields[] = {
1222
{ "zone list", &cfg_type_rpz_list, 0 },
1223
{ "recursive-only", &cfg_type_boolean, 0 },
1224
{ "break-dnssec", &cfg_type_boolean, 0 },
1225
{ "max-policy-ttl", &cfg_type_uint32, 0 },
1122
1228
static cfg_type_t cfg_type_rpz = {
1123
"rpz", cfg_parse_map, cfg_print_map, cfg_doc_map,
1124
&cfg_rep_map, rpz_clausesets
1229
"rpz", cfg_parse_kv_tuple,
1230
cfg_print_kv_tuple, cfg_doc_kv_tuple, &cfg_rep_tuple,
1130
1236
* dnssec-lookaside