parser.c revision ad1317338af79edad878c9c3e4361798503310ba
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉/*
e1836d1fe413cc14430ce89508e79c4c01df830bTinderbox User * Copyright (C) 2000-2017 Internet Systems Consortium, Inc. ("ISC")
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉/*! \file */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <config.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <stdlib.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrews#include <isc/buffer.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isc/dir.h>
2fff8b8280779a25fbdb891b2d3d9b435d2084f0Tatuya JINMEI 神明達哉#include <isc/formatcheck.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isc/lex.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isc/log.h>
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉#include <isc/mem.h>
1bb2f53b9f74a8ca9812cbe9243ef41190b4da14Evan Hunt#include <isc/net.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isc/netaddr.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isc/netscope.h>
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉#include <isc/print.h>
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews#include <isc/string.h>
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews#include <isc/sockaddr.h>
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews#include <isc/symtab.h>
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews#include <isc/util.h>
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews#include <isccfg/cfg.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isccfg/grammar.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isccfg/log.h>
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉/* Shorthand */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#define CAT CFG_LOGCATEGORY_CONFIG
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#define MOD CFG_LOGMODULE_PARSER
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#define MAP_SYM 1 /* Unique type for isc_symtab */
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews#define TOKEN_STRING(pctx) (pctx->token.value.as_textregion.base)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉/* Check a return value. */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#define CHECK(op) \
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 do { result = (op); \
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS) goto cleanup; \
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 } while (0)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
7f1785d0ded8897082abacec5219b27feac755afFrancis Dupont/* Clean up a configuration object if non-NULL. */
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater#define CLEANUP_OBJ(obj) \
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 do { if ((obj) != NULL) cfg_obj_destroy(pctx, &(obj)); } while (0)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉/*
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * Forward declarations of static functions.
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static void
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsfree_tuple(cfg_parser_t *pctx, cfg_obj_t *obj);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntstatic isc_result_t
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntparse_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntstatic void
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntprint_list(cfg_printer_t *pctx, const cfg_obj_t *obj);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsstatic void
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsfree_list(cfg_parser_t *pctx, cfg_obj_t *obj);
2fff8b8280779a25fbdb891b2d3d9b435d2084f0Tatuya JINMEI 神明達哉
2fff8b8280779a25fbdb891b2d3d9b435d2084f0Tatuya JINMEI 神明達哉static isc_result_t
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewscreate_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewsstatic isc_result_t
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewscreate_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews cfg_obj_t **ret);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsstatic void
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsfree_string(cfg_parser_t *pctx, cfg_obj_t *obj);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsstatic isc_result_t
a70fc47e9dc165175e77f091076559748858a488Mark Andrewscreate_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **objp);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsstatic void
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsfree_map(cfg_parser_t *pctx, cfg_obj_t *obj);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsstatic isc_result_t
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsparse_symtab_elt(cfg_parser_t *pctx, const char *name,
a70fc47e9dc165175e77f091076559748858a488Mark Andrews cfg_type_t *elttype, isc_symtab_t *symtab,
a70fc47e9dc165175e77f091076559748858a488Mark Andrews isc_boolean_t callback);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsstatic void
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsfree_noop(cfg_parser_t *pctx, cfg_obj_t *obj);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsstatic isc_result_t
a70fc47e9dc165175e77f091076559748858a488Mark Andrewscfg_getstringtoken(cfg_parser_t *pctx);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsstatic void
a70fc47e9dc165175e77f091076559748858a488Mark Andrewsparser_complain(cfg_parser_t *pctx, isc_boolean_t is_warning,
a70fc47e9dc165175e77f091076559748858a488Mark Andrews unsigned int flags, const char *format, va_list args);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrews/*
a70fc47e9dc165175e77f091076559748858a488Mark Andrews * Data representations. These correspond to members of the
a70fc47e9dc165175e77f091076559748858a488Mark Andrews * "value" union in struct cfg_obj (except "void", which does
a70fc47e9dc165175e77f091076559748858a488Mark Andrews * not need a union member).
a70fc47e9dc165175e77f091076559748858a488Mark Andrews */
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_uint32 = { "uint32", free_noop };
a70fc47e9dc165175e77f091076559748858a488Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_uint64 = { "uint64", free_noop };
a70fc47e9dc165175e77f091076559748858a488Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_string = { "string", free_string };
a70fc47e9dc165175e77f091076559748858a488Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_boolean = { "boolean", free_noop };
a70fc47e9dc165175e77f091076559748858a488Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_map = { "map", free_map };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉LIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_list = { "list", free_list };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉LIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_tuple = { "tuple", free_tuple };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉LIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_sockaddr = { "sockaddr", free_noop };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉LIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_netprefix =
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 { "netprefix", free_noop };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉LIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_void = { "void", free_noop };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉LIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_fixedpoint =
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt { "fixedpoint", free_noop };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉LIBISCCFG_EXTERNAL_DATA cfg_rep_t cfg_rep_percentage =
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 { "percentage", free_noop };
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * Configuration type definitions.
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews/*%
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews * An implicit list. These are formed by clauses that occur multiple times.
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 */
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉static cfg_type_t cfg_type_implicitlist = {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt "implicitlist", NULL, print_list, NULL, &cfg_rep_list, NULL };
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉/* Functions. */
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_obj(cfg_printer_t *pctx, const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 obj->type->print(pctx, obj);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉}
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntvoid
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉cfg_print_chars(cfg_printer_t *pctx, const char *text, int len) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt REQUIRE(text != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt pctx->f(pctx->closure, text, len);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
7204d08a319cf590ae4280b8cc20999320398574Mark Andrewsstatic void
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewsprint_open(cfg_printer_t *pctx) {
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if ((pctx->flags & CFG_PRINTER_ONELINE) != 0)
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_print_cstr(pctx, "{ ");
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews else {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_print_cstr(pctx, "{\n");
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->indent++;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉static void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉print_indent(cfg_printer_t *pctx) {
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt int indent = pctx->indent;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if ((pctx->flags & CFG_PRINTER_ONELINE) != 0) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_print_cstr(pctx, " ");
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt return;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt while (indent > 0) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_cstr(pctx, "\t");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt indent--;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉static void
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉print_close(cfg_printer_t *pctx) {
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if ((pctx->flags & CFG_PRINTER_ONELINE) == 0) {
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 pctx->indent--;
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews print_indent(pctx);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews }
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews cfg_print_cstr(pctx, "}");
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉}
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉isc_result_t
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewscfg_parse_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 isc_result_t result;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 REQUIRE(type != NULL);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 REQUIRE(ret != NULL && *ret == NULL);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 result = type->parse(pctx, type, ret);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
dc842cdcb946b3f89448f07a9f024497a50c216aMark Andrews return (result);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 ENSURE(*ret != NULL);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉}
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrewsvoid
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewscfg_print(const cfg_obj_t *obj,
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews void (*f)(void *closure, const char *text, int textlen),
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews void *closure)
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉{
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(obj != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(f != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_printx(obj, 0, f, closure);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_printx(const cfg_obj_t *obj, unsigned int flags,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 void (*f)(void *closure, const char *text, int textlen),
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 void *closure)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉{
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_printer_t pctx;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(obj != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(f != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx.f = f;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx.closure = closure;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx.indent = 0;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx.flags = flags;
31f6244cc25ab0f8937edc26dbb26ba4f6a01f19Evan Hunt obj->type->print(&pctx, obj);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉/* Tuples. */
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉isc_result_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_create_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_result_t result;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *fields = type->of;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *f;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_obj_t *obj = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 unsigned int nfields = 0;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 int i;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(type != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(ret != NULL && *ret == NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 for (f = fields; f->name != NULL; f++)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 nfields++;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(cfg_create_obj(pctx, type, &obj));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 obj->value.tuple = isc_mem_get(pctx->mctx,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 nfields * sizeof(cfg_obj_t *));
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb if (obj->value.tuple == NULL) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 result = ISC_R_NOMEMORY;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 goto cleanup;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 for (f = fields, i = 0; f->name != NULL; f++, i++)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 obj->value.tuple[i] = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 *ret = obj;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cleanup:
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (obj != NULL)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (result);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntisc_result_t
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntcfg_parse_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
4786e693a7c4b41ba4554f06a2f6d16c74017f15Mark Andrews{
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt isc_result_t result;
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt const cfg_tuplefielddef_t *fields = type->of;
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt const cfg_tuplefielddef_t *f;
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt cfg_obj_t *obj = NULL;
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt unsigned int i;
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt
31f6244cc25ab0f8937edc26dbb26ba4f6a01f19Evan Hunt REQUIRE(pctx != NULL);
31f6244cc25ab0f8937edc26dbb26ba4f6a01f19Evan Hunt REQUIRE(type != NULL);
02a5e3ed85cbfc099874bb34e5901537399b5e24Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
1f5659fe68a5333b9cf8f31542445a8915f781ccMark Andrews
1f5659fe68a5333b9cf8f31542445a8915f781ccMark Andrews CHECK(cfg_create_tuple(pctx, type, &obj));
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews for (f = fields, i = 0; f->name != NULL; f++, i++)
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews CHECK(cfg_parse_obj(pctx, f->type, &obj->value.tuple[i]));
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews *ret = obj;
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews return (ISC_R_SUCCESS);
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews
ecff557eebd67a717ab6fd3323af27363ee3273dMark Andrews cleanup:
f10a67dad21d7dd87ee2144964faa639f96766b5Witold Krecicki CLEANUP_OBJ(obj);
8e50c697839c12d55bca0202ce09bd81f069f909Tinderbox User return (result);
8e50c697839c12d55bca0202ce09bd81f069f909Tinderbox User}
f10a67dad21d7dd87ee2144964faa639f96766b5Witold Krecicki
8e50c697839c12d55bca0202ce09bd81f069f909Tinderbox Uservoid
8e50c697839c12d55bca0202ce09bd81f069f909Tinderbox Usercfg_print_tuple(cfg_printer_t *pctx, const cfg_obj_t *obj) {
8e50c697839c12d55bca0202ce09bd81f069f909Tinderbox User unsigned int i;
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews const cfg_tuplefielddef_t *fields;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *f;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 isc_boolean_t need_space = ISC_FALSE;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews REQUIRE(pctx != NULL);
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews REQUIRE(obj != NULL);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews fields = obj->type->of;
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 for (f = fields, i = 0; f->name != NULL; f++, i++) {
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 const cfg_obj_t *fieldobj = obj->value.tuple[i];
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (need_space && fieldobj->type->rep != &cfg_rep_void)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_print_cstr(pctx, " ");
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_print_obj(pctx, fieldobj);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 need_space = ISC_TF(need_space ||
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater fieldobj->type->print != cfg_print_void);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_doc_tuple(cfg_printer_t *pctx, const cfg_type_t *type) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *fields;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *f;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_boolean_t need_space = ISC_FALSE;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(type != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 fields = type->of;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 for (f = fields; f->name != NULL; f++) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (need_space)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_print_cstr(pctx, " ");
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_doc_obj(pctx, f->type);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 need_space = ISC_TF(f->type->print != cfg_print_void);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntstatic void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉free_tuple(cfg_parser_t *pctx, cfg_obj_t *obj) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 unsigned int i;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *fields = obj->type->of;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *f;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 unsigned int nfields = 0;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (obj->value.tuple == NULL)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 for (f = fields, i = 0; f->name != NULL; f++, i++) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CLEANUP_OBJ(obj->value.tuple[i]);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 nfields++;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_mem_put(pctx->mctx, obj->value.tuple,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 nfields * sizeof(cfg_obj_t *));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉isc_boolean_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_obj_istuple(const cfg_obj_t *obj) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(obj != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_TF(obj->type->rep == &cfg_rep_tuple));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉const cfg_obj_t *
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_tuple_get(const cfg_obj_t *tupleobj, const char* name) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 unsigned int i;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *fields;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_tuplefielddef_t *f;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(tupleobj != NULL && tupleobj->type->rep == &cfg_rep_tuple);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(name != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 fields = tupleobj->type->of;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 for (f = fields, i = 0; f->name != NULL; f++, i++) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt if (strcmp(f->name, name) == 0)
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (tupleobj->value.tuple[i]);
71dfdcbfae32f150179f93476f9ff71b30336cb9Mark Andrews }
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews INSIST(0);
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews return (NULL);
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews}
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrewsisc_result_t
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrewscfg_parse_special(cfg_parser_t *pctx, int special) {
09ab38c151751b76b8043275422239463eb70cbdMark Andrews isc_result_t result;
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews
1479200aa05414b2acf33607dbd1682c16f58c51Evan Hunt REQUIRE(pctx != NULL);
1479200aa05414b2acf33607dbd1682c16f58c51Evan Hunt
1479200aa05414b2acf33607dbd1682c16f58c51Evan Hunt CHECK(cfg_gettoken(pctx, 0));
35c014cb1d151983c455ad1ac99093591cbda97aMark Andrews if (pctx->token.type == isc_tokentype_special &&
1361e038900701e126213261c0a1178025ae5a72Tinderbox User pctx->token.value.as_char == special)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR, "'%c' expected", special);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt cleanup:
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews return (result);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt}
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt/*
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * Parse a required semicolon. If it is not there, log
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * an error and increment the error count but continue
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * parsing. Since the next token is pushed back,
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * care must be taken to make sure it is eventually
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * consumed or an infinite loop may result.
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt */
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntstatic isc_result_t
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntparse_semicolon(cfg_parser_t *pctx) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt isc_result_t result;
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt CHECK(cfg_gettoken(pctx, 0));
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt if (pctx->token.type == isc_tokentype_special &&
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt pctx->token.value.as_char == ';')
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (ISC_R_SUCCESS);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 cfg_parser_error(pctx, CFG_LOG_BEFORE, "missing ';'");
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews cfg_ungettoken(pctx);
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews cleanup:
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews return (result);
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews}
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉/*
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 * Parse EOF, logging and returning an error if not there.
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 */
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉static isc_result_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉parse_eof(cfg_parser_t *pctx) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_result_t result;
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(cfg_gettoken(pctx, 0));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (pctx->token.type == isc_tokentype_eof)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_parser_error(pctx, CFG_LOG_NEAR, "syntax error");
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_R_UNEXPECTEDTOKEN);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cleanup:
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (result);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉/* A list of files, used internally for pctx->files. */
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉static cfg_type_t cfg_type_filelist = {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 "filelist", NULL, print_list, NULL, &cfg_rep_list,
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb &cfg_type_qstring
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb};
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉isc_result_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_result_t result;
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews cfg_parser_t *pctx;
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews isc_lexspecials_t specials;
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews REQUIRE(mctx != NULL);
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx = isc_mem_get(mctx, sizeof(*pctx));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (pctx == NULL)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_R_NOMEMORY);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->mctx = NULL;
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater isc_mem_attach(mctx, &pctx->mctx);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 result = isc_refcount_init(&pctx->references, 1);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater return (result);
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->lctx = lctx;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->lexer = NULL;
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews pctx->seen_eof = ISC_FALSE;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->ungotten = ISC_FALSE;
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater pctx->errors = 0;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->warnings = 0;
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater pctx->open_files = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->closed_files = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->line = 0;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->callback = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->callbackarg = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->token.type = isc_tokentype_unknown;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->flags = 0;
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews pctx->buf_name = NULL;
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 memset(specials, 0, sizeof(specials));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 specials['{'] = 1;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 specials['}'] = 1;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 specials[';'] = 1;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 specials['/'] = 1;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 specials['"'] = 1;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 specials['!'] = 1;
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(isc_lex_create(pctx->mctx, 1024, &pctx->lexer));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_lex_setspecials(pctx->lexer, specials);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_lex_setcomments(pctx->lexer, (ISC_LEXCOMMENT_C |
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 ISC_LEXCOMMENT_CPLUSPLUS |
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 ISC_LEXCOMMENT_SHELL));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(cfg_create_list(pctx, &cfg_type_filelist, &pctx->open_files));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(cfg_create_list(pctx, &cfg_type_filelist, &pctx->closed_files));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 *ret = pctx;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cleanup:
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (pctx->lexer != NULL)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_lex_destroy(&pctx->lexer);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CLEANUP_OBJ(pctx->open_files);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CLEANUP_OBJ(pctx->closed_files);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (result);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉static isc_result_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉parser_openfile(cfg_parser_t *pctx, const char *filename) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_result_t result;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_listelt_t *elt = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_obj_t *stringobj = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 result = isc_lex_openfile(pctx->lexer, filename);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_parser_error(pctx, 0, "open: %s: %s",
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 filename, isc_result_totext(result));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 goto cleanup;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(create_string(pctx, filename, &cfg_type_qstring, &stringobj));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(create_listelt(pctx, &elt));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 elt->obj = stringobj;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 ISC_LIST_APPEND(pctx->open_files->value.list, elt, link);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cleanup:
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CLEANUP_OBJ(stringobj);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (result);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_parser_setcallback(cfg_parser_t *pctx,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_parsecallback_t callback,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 void *arg)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉{
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->callback = callback;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->callbackarg = arg;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_parser_reset(cfg_parser_t *pctx) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (pctx->lexer != NULL)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_lex_close(pctx->lexer);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->seen_eof = ISC_FALSE;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 pctx->ungotten = ISC_FALSE;
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews pctx->errors = 0;
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt pctx->warnings = 0;
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt pctx->line = 0;
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt}
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt/*
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * Parse a configuration using a pctx where a lexer has already
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews * been set up with a source.
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 */
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉static isc_result_t
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Huntparse2(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt isc_result_t result;
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt cfg_obj_t *obj = NULL;
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt result = cfg_parse_obj(pctx, type, &obj);
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt if (pctx->errors != 0) {
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt /* Errors have been logged. */
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt if (result == ISC_R_SUCCESS)
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt result = ISC_R_FAILURE;
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt goto cleanup;
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt }
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt if (result != ISC_R_SUCCESS) {
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt /* Parsing failed but no errors have been logged. */
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt cfg_parser_error(pctx, 0, "parsing failed");
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt goto cleanup;
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt }
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt CHECK(parse_eof(pctx));
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt *ret = obj;
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt return (ISC_R_SUCCESS);
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt cleanup:
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt CLEANUP_OBJ(obj);
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt return (result);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews}
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrewsisc_result_t
7204d08a319cf590ae4280b8cc20999320398574Mark Andrewscfg_parse_file(cfg_parser_t *pctx, const char *filename,
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews const cfg_type_t *type, cfg_obj_t **ret)
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews{
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews isc_result_t result;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_listelt_t *elt;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews REQUIRE(pctx != NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews REQUIRE(filename != NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews REQUIRE(type != NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews CHECK(parser_openfile(pctx, filename));
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews result = parse2(pctx, type, ret);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews /* Clean up the opened file */
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews elt = ISC_LIST_TAIL(pctx->open_files->value.list);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews INSIST(elt != NULL);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 ISC_LIST_UNLINK(pctx->open_files->value.list, elt, link);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 ISC_LIST_APPEND(pctx->closed_files->value.list, elt, link);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 cleanup:
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 return (result);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt}
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉isc_result_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const cfg_type_t *type, cfg_obj_t **ret)
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt{
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt return (cfg_parse_buffer3(pctx, buffer, NULL, 0, type, ret));
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews}
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewsisc_result_t
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉cfg_parse_buffer2(cfg_parser_t *pctx, isc_buffer_t *buffer,
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 const char *file, const cfg_type_t *type,
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 cfg_obj_t **ret)
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉{
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (cfg_parse_buffer3(pctx, buffer, file, 0, type, ret));
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt}
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉isc_result_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_parse_buffer3(cfg_parser_t *pctx, isc_buffer_t *buffer,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 const char *file, unsigned int line,
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt const cfg_type_t *type, cfg_obj_t **ret)
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt{
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews isc_result_t result;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(type != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(buffer != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(isc_lex_openbuffer(pctx->lexer, buffer));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt pctx->buf_name = file;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (line != 0U)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(isc_lex_setsourceline(pctx->lexer, line));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(parse2(pctx, type, ret));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt pctx->buf_name = NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cleanup:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (result);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_parser_attach(cfg_parser_t *src, cfg_parser_t **dest) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(src != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(dest != NULL && *dest == NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_refcount_increment(&src->references, NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt *dest = src;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_parser_destroy(cfg_parser_t **pctxp) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_t *pctx;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt unsigned int refs;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctxp != NULL && *pctxp != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt pctx = *pctxp;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt *pctxp = NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_refcount_decrement(&pctx->references, &refs);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (refs == 0) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_lex_destroy(&pctx->lexer);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt /*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * Cleaning up open_files does not
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * close the files; that was already done
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * by closing the lexer.
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CLEANUP_OBJ(pctx->open_files);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CLEANUP_OBJ(pctx->closed_files);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * void
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_result_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_parse_void(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(type);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (cfg_create_obj(pctx, &cfg_type_void, ret));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_void(cfg_printer_t *pctx, const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(pctx);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(obj);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_doc_void(cfg_printer_t *pctx, const cfg_type_t *type) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(type != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(pctx);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(type);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_boolean_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_isvoid(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_TF(obj->type->rep == &cfg_rep_void));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_void = {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "void", cfg_parse_void, cfg_print_void, cfg_doc_void, &cfg_rep_void,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt NULL };
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * percentage
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_result_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_parse_percentage(cfg_parser_t *pctx, const cfg_type_t *type,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_t **ret)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt{
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt char *endp;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_result_t result;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_t *obj = NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_uint64_t percent;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(type);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_gettoken(pctx, 0));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (pctx->token.type != isc_tokentype_string) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "expected percentage");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt percent = isc_string_touint64(TOKEN_STRING(pctx), &endp, 10);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (*endp != '%' || *(endp+1) != 0) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "expected percentage");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_create_obj(pctx, &cfg_type_percentage, &obj));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.uint32 = (isc_uint32_t)percent;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt *ret = obj;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cleanup:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (result);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_percentage(cfg_printer_t *pctx, const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt char buf[64];
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt int n;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt n = snprintf(buf, sizeof(buf), "%u%%", obj->value.uint32);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt INSIST(n > 0 && (size_t)n < sizeof(buf));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_chars(pctx, buf, strlen(buf));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_uint32_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_aspercentage(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_percentage);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (obj->value.uint32);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_percentage = {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "percentage", cfg_parse_percentage, cfg_print_percentage,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_doc_terminal, &cfg_rep_percentage, NULL
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt};
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_boolean_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_ispercentage(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_TF(obj->type->rep == &cfg_rep_percentage));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * Fixed point
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_result_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_parse_fixedpoint(cfg_parser_t *pctx, const cfg_type_t *type,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_t **ret)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt{
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_result_t result;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_t *obj = NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt size_t n1, n2, n3, l;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt const char *p;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(type);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_gettoken(pctx, 0));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (pctx->token.type != isc_tokentype_string) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "expected fixed point number");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt p = TOKEN_STRING(pctx);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt l = strlen(p);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt n1 = strspn(p, "0123456789");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt n2 = strspn(p + n1, ".");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt n3 = strspn(p + n1 + n2, "0123456789");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if ((n1 + n2 + n3 != l) || (n1 + n3 == 0) ||
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt n1 > 5 || n2 > 1 || n3 > 2) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "expected fixed point number");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_create_obj(pctx, &cfg_type_fixedpoint, &obj));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.uint32 = strtoul(p, NULL, 10) * 100;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt switch (n3) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt case 2:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.uint32 += strtoul(p + n1 + n2, NULL, 10);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt break;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt case 1:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.uint32 += strtoul(p + n1 + n2, NULL, 10) * 10;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt break;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt *ret = obj;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cleanup:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (result);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_fixedpoint(cfg_printer_t *pctx, const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt char buf[64];
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt int n;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt n = snprintf(buf, sizeof(buf), "%u.%02u",
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.uint32/100, obj->value.uint32%100);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt INSIST(n > 0 && (size_t)n < sizeof(buf));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_chars(pctx, buf, strlen(buf));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_uint32_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_asfixedpoint(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_fixedpoint);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (obj->value.uint32);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_fixedpoint = {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "fixedpoint", cfg_parse_fixedpoint, cfg_print_fixedpoint,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_doc_terminal, &cfg_rep_fixedpoint, NULL
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt};
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_boolean_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_isfixedpoint(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_TF(obj->type->rep == &cfg_rep_fixedpoint));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * uint32
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_result_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_parse_uint32(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_result_t result;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_t *obj = NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(pctx != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt UNUSED(type);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER | ISC_LEXOPT_CNUMBER));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (pctx->token.type != isc_tokentype_number) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR, "expected number");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_create_obj(pctx, &cfg_type_uint32, &obj));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.uint32 = pctx->token.value.as_ulong;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt *ret = obj;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cleanup:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (result);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_cstr(cfg_printer_t *pctx, const char *s) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_chars(pctx, s, strlen(s));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_rawuint(cfg_printer_t *pctx, unsigned int u) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt char buf[32];
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt snprintf(buf, sizeof(buf), "%u", u);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_cstr(pctx, buf);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_uint32(cfg_printer_t *pctx, const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_rawuint(pctx, obj->value.uint32);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_boolean_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_isuint32(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_TF(obj->type->rep == &cfg_rep_uint32));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_uint32_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_asuint32(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_uint32);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (obj->value.uint32);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_uint32 = {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "integer", cfg_parse_uint32, cfg_print_uint32, cfg_doc_terminal,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt &cfg_rep_uint32, NULL
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt};
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * uint64
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_boolean_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_isuint64(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (ISC_TF(obj->type->rep == &cfg_rep_uint64));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntisc_uint64_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_asuint64(const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_uint64);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (obj->value.uint64);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_print_uint64(cfg_printer_t *pctx, const cfg_obj_t *obj) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt char buf[32];
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt snprintf(buf, sizeof(buf), "%" ISC_PRINT_QUADFORMAT "u",
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.uint64);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_cstr(pctx, buf);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_uint64 = {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "64_bit_integer", NULL, cfg_print_uint64, cfg_doc_terminal,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt &cfg_rep_uint64, NULL
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt};
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * qstring (quoted string), ustring (unquoted string), astring
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * (any string)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt/* Create a string object from a null-terminated C string. */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntstatic isc_result_t
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcreate_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_t **ret)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt{
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_result_t result;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_t *obj = NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt int len;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_create_obj(pctx, type, &obj));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt len = strlen(contents);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.string.length = len;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt obj->value.string.base = isc_mem_get(pctx->mctx, len + 1);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if (obj->value.string.base == 0) {
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 return (ISC_R_NOMEMORY);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 }
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 memmove(obj->value.string.base, contents, len);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews obj->value.string.base[len] = '\0';
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews *ret = obj;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cleanup:
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (result);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉isc_result_t
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrewscfg_parse_qstring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt isc_result_t result;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(ret != NULL && *ret == NULL);
af669cb4fd7ecfb67ed145b176e5e764b249573bMark Andrews
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 UNUSED(type);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews if (pctx->token.type != isc_tokentype_qstring) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR, "expected quoted string");
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews return (ISC_R_UNEXPECTEDTOKEN);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (create_string(pctx, TOKEN_STRING(pctx),
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_type_qstring, ret));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (result);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews}
e5d447be8c18eca7b858665323b07907019c0b96Mark Andrews
e5d447be8c18eca7b858665323b07907019c0b96Mark Andrewsstatic isc_result_t
e5d447be8c18eca7b858665323b07907019c0b96Mark Andrewsparse_ustring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_result_t result;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 UNUSED(type);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CHECK(cfg_gettoken(pctx, 0));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (pctx->token.type != isc_tokentype_string) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected unquoted string");
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (create_string(pctx,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt TOKEN_STRING(pctx),
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_type_ustring,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt ret));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntisc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_parse_astring(cfg_parser_t *pctx, const cfg_type_t *type,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_obj_t **ret)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉{
af669cb4fd7ecfb67ed145b176e5e764b249573bMark Andrews isc_result_t result;
af669cb4fd7ecfb67ed145b176e5e764b249573bMark Andrews
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(ret != NULL && *ret == NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 UNUSED(type);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt CHECK(cfg_getstringtoken(pctx));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (create_string(pctx,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 TOKEN_STRING(pctx),
af669cb4fd7ecfb67ed145b176e5e764b249573bMark Andrews &cfg_type_qstring,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 ret));
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt cleanup:
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉isc_result_t
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbcfg_parse_sstring(cfg_parser_t *pctx, const cfg_type_t *type,
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_obj_t **ret)
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews{
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews isc_result_t result;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb REQUIRE(pctx != NULL);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews UNUSED(type);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews CHECK(cfg_getstringtoken(pctx));
af669cb4fd7ecfb67ed145b176e5e764b249573bMark Andrews return (create_string(pctx,
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb TOKEN_STRING(pctx),
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb &cfg_type_sstring,
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews ret));
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cleanup:
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews return (result);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews}
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbstatic isc_result_t
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbparse_btext(cfg_parser_t *pctx, const cfg_type_t *type,
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_obj_t **ret)
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb{
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb isc_result_t result;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb UNUSED(type);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_BTEXT));
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews if (pctx->token.type != isc_tokentype_btext) {
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR,
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb "expected bracketed text");
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (ISC_R_UNEXPECTEDTOKEN);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb }
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (create_string(pctx,
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb TOKEN_STRING(pctx),
af669cb4fd7ecfb67ed145b176e5e764b249573bMark Andrews &cfg_type_bracketed_text,
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb ret));
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cleanup:
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (result);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbstatic void
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsprint_btext(cfg_printer_t *pctx, const cfg_obj_t *obj) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 /*
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * We need to print "{" instead of running print_open()
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * in order to preserve the exact original formatting
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * of the bracketed text. But we increment the indent value
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * so that print_close() will leave us back in our original
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * state.
af669cb4fd7ecfb67ed145b176e5e764b249573bMark Andrews */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt pctx->indent++;
1f06836037b038e5b051dc0a6f910c6c38ccff64Mark Andrews cfg_print_cstr(pctx, "{");
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 cfg_print_chars(pctx, obj->value.string.base, obj->value.string.length);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews print_close(pctx);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews}
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrewsstatic void
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbdoc_btext(cfg_printer_t *pctx, const cfg_type_t *type) {
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb UNUSED(type);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_print_cstr(pctx, "{ <unspecified-text> }");
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsisc_boolean_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscfg_is_enum(const char *s, const char *const *enums) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews const char * const *p;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(s != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(enums != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews for (p = enums; *p != NULL; p++) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews if (strcasecmp(*p, s) == 0)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_TRUE);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_FALSE);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsstatic isc_result_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscheck_enum(cfg_parser_t *pctx, cfg_obj_t *obj, const char *const *enums) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews const char *s = obj->value.string.base;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews if (cfg_is_enum(s, enums))
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (ISC_R_SUCCESS);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_parser_error(pctx, 0, "'%s' unexpected", s);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (ISC_R_UNEXPECTEDTOKEN);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsisc_result_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscfg_parse_enum(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt isc_result_t result;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_obj_t *obj = NULL;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(pctx != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(type != NULL);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb CHECK(parse_ustring(pctx, NULL, &obj));
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb CHECK(check_enum(pctx, obj, type->of));
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews *ret = obj;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (ISC_R_SUCCESS);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cleanup:
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CLEANUP_OBJ(obj);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntvoid
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_doc_enum(cfg_printer_t *pctx, const cfg_type_t *type) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt const char * const *p;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(type != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_cstr(pctx, "( ");
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews for (p = type->of; *p != NULL; p++) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_cstr(pctx, *p);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews if (p[1] != NULL)
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_print_cstr(pctx, " | ");
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews }
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_print_cstr(pctx, " )");
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb}
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrewsvoid
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrewscfg_print_ustring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(pctx != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(obj != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_chars(pctx, obj->value.string.base, obj->value.string.length);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsstatic void
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsprint_qstring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_cstr(pctx, "\"");
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrews cfg_print_ustring(pctx, obj);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_cstr(pctx, "\"");
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsstatic void
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntprint_sstring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_print_cstr(pctx, "\"");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((pctx->flags & CFG_PRINTER_XKEY) != 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt unsigned int len = obj->value.string.length;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews while (len-- > 0)
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_cstr(pctx, "?");
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews } else
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_ustring(pctx, obj);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_print_cstr(pctx, "\"");
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsstatic void
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsfree_string(cfg_parser_t *pctx, cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews isc_mem_put(pctx->mctx, obj->value.string.base,
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews obj->value.string.length + 1);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsisc_boolean_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscfg_obj_isstring(const cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(obj != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (ISC_TF(obj->type->rep == &cfg_rep_string));
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrews}
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrews
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrewsconst char *
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrewscfg_obj_asstring(const cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_string);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (obj->value.string.base);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrews
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrews/* Quoted string only */
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_qstring = {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt "quoted_string", cfg_parse_qstring, print_qstring, cfg_doc_terminal,
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews &cfg_rep_string, NULL
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews};
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews/* Unquoted string only */
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_ustring = {
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrews "string", parse_ustring, cfg_print_ustring, cfg_doc_terminal,
80fa3ef8517ff046a72c4cb1e785f30c9ef9ee75Mark Andrews &cfg_rep_string, NULL
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews};
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews/* Any string (quoted or unquoted); printed with quotes */
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_astring = {
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews "string", cfg_parse_astring, print_qstring, cfg_doc_terminal,
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews &cfg_rep_string, NULL
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews};
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews/*
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews * Any string (quoted or unquoted); printed with quotes.
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * If CFG_PRINTER_XKEY is set when printing the string will be '?' out.
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_sstring = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "string", cfg_parse_sstring, print_sstring, cfg_doc_terminal,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_string, NULL
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt/*
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * Text enclosed in brackets. Used to pass a block of configuration
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * text to dynamic library or external application. Checked for
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * bracket balance, but not otherwise parsed.
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews */
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_bracketed_text = {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews "bracketed_text", parse_btext, print_btext, doc_btext,
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews &cfg_rep_string, NULL
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews};
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb/*
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb * Booleans
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews */
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrewsisc_boolean_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscfg_obj_isboolean(const cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(obj != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (ISC_TF(obj->type->rep == &cfg_rep_boolean));
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
0874abad14e3e9ecfc3dc1a1a2b9969f2f027724Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsisc_boolean_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscfg_obj_asboolean(const cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_boolean);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (obj->value.boolean);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsisc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt{
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews isc_boolean_t value;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_obj_t *obj = NULL;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(pctx != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(ret != NULL && ret != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt UNUSED(type);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews result = cfg_gettoken(pctx, 0);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews if (result != ISC_R_SUCCESS)
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (result);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews if (pctx->token.type != isc_tokentype_string)
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews goto bad_boolean;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb if ((strcasecmp(TOKEN_STRING(pctx), "true") == 0) ||
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews (strcasecmp(TOKEN_STRING(pctx), "yes") == 0) ||
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews (strcmp(TOKEN_STRING(pctx), "1") == 0)) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews value = ISC_TRUE;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews } else if ((strcasecmp(TOKEN_STRING(pctx), "false") == 0) ||
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt (strcasecmp(TOKEN_STRING(pctx), "no") == 0) ||
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt (strcmp(TOKEN_STRING(pctx), "0") == 0)) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt value = ISC_FALSE;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt goto bad_boolean;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_create_obj(pctx, &cfg_type_boolean, &obj));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt obj->value.boolean = value;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews *ret = obj;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (result);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews bad_boolean:
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR, "boolean expected");
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews return (ISC_R_UNEXPECTEDTOKEN);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cleanup:
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (result);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews}
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrewsvoid
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscfg_print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(pctx != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(obj != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (obj->value.boolean)
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "yes");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews else
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "no");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_boolean = {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews "boolean", cfg_parse_boolean, cfg_print_boolean, cfg_doc_terminal,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews &cfg_rep_boolean, NULL
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews};
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews/*
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews * Lists.
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews */
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsisc_result_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_create_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **obj) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_result_t result;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(pctx != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(type != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(obj != NULL && *obj == NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(cfg_create_obj(pctx, type, obj));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews ISC_LIST_INIT((*obj)->value.list);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cleanup:
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (result);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsstatic isc_result_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscreate_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_listelt_t *elt;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews elt = isc_mem_get(pctx->mctx, sizeof(*elt));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (elt == NULL)
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (ISC_R_NOMEMORY);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews elt->obj = NULL;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews ISC_LINK_INIT(elt, link);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews *eltp = elt;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (ISC_R_SUCCESS);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsstatic void
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsfree_listelt(cfg_parser_t *pctx, cfg_listelt_t *elt) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (elt->obj != NULL)
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_obj_destroy(pctx, &elt->obj);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_mem_put(pctx->mctx, elt, sizeof(*elt));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsstatic void
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsfree_list(cfg_parser_t *pctx, cfg_obj_t *obj) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_listelt_t *elt, *next;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews for (elt = ISC_LIST_HEAD(obj->value.list);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews elt != NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 elt = next)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt next = ISC_LIST_NEXT(elt, link);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt free_listelt(pctx, elt);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntisc_result_t
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_parse_listelt(cfg_parser_t *pctx, const cfg_type_t *elttype,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_listelt_t **ret)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt{
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_result_t result;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_listelt_t *elt = NULL;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_obj_t *value = NULL;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt REQUIRE(pctx != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(elttype != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CHECK(create_listelt(pctx, &elt));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb result = cfg_parse_obj(pctx, elttype, &value);
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt if (result != ISC_R_SUCCESS)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 goto cleanup;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
3acc5d636efffa19d04398310a5d27ddfcfb8ff3Mark Andrews elt->obj = value;
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt *ret = elt;
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt return (ISC_R_SUCCESS);
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt cleanup:
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews isc_mem_put(pctx->mctx, elt, sizeof(*elt));
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (result);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb}
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb/*
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt * Parse a homogeneous list whose elements are of type 'elttype'
08f01297320b7ad55d0abff0aca9a577196079e2Mukund Sivaraman * and where each element is terminated by a semicolon.
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb */
08f01297320b7ad55d0abff0aca9a577196079e2Mukund Sivaramanstatic isc_result_t
08f01297320b7ad55d0abff0aca9a577196079e2Mukund Sivaramanparse_list(cfg_parser_t *pctx, const cfg_type_t *listtype, cfg_obj_t **ret)
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews{
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_obj_t *listobj = NULL;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb const cfg_type_t *listof = listtype->of;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb isc_result_t result;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_listelt_t *elt = NULL;
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrews CHECK(cfg_create_list(pctx, listtype, &listobj));
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
a70fc47e9dc165175e77f091076559748858a488Mark Andrews for (;;) {
a70fc47e9dc165175e77f091076559748858a488Mark Andrews CHECK(cfg_peektoken(pctx, 0));
a70fc47e9dc165175e77f091076559748858a488Mark Andrews if (pctx->token.type == isc_tokentype_special &&
a70fc47e9dc165175e77f091076559748858a488Mark Andrews pctx->token.value.as_char == /*{*/ '}')
a70fc47e9dc165175e77f091076559748858a488Mark Andrews break;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews CHECK(cfg_parse_listelt(pctx, listof, &elt));
3ff75c89eb7b8c4f8c7dd375beec2981d147c791Evan Hunt CHECK(parse_semicolon(pctx));
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews ISC_LIST_APPEND(listobj->value.list, elt, link);
3ff75c89eb7b8c4f8c7dd375beec2981d147c791Evan Hunt elt = NULL;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews }
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb *ret = listobj;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (ISC_R_SUCCESS);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cleanup:
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt if (elt != NULL)
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews free_listelt(pctx, elt);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb CLEANUP_OBJ(listobj);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (result);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb}
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntstatic void
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntprint_list(cfg_printer_t *pctx, const cfg_obj_t *obj) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt const cfg_list_t *list = &obj->value.list;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews const cfg_listelt_t *elt;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb for (elt = ISC_LIST_HEAD(*list);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb elt != NULL;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb elt = ISC_LIST_NEXT(elt, link))
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb {
40a7e85f3ee3bd66a8f87bf8af674e1e48b05396Evan Hunt if ((pctx->flags & CFG_PRINTER_ONELINE) != 0) {
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_print_obj(pctx, elt->obj);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_print_cstr(pctx, "; ");
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb } else {
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb print_indent(pctx);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_print_obj(pctx, elt->obj);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_print_cstr(pctx, ";\n");
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb }
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb }
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb}
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbisc_result_t
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbcfg_parse_bracketed_list(cfg_parser_t *pctx, const cfg_type_t *type,
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_obj_t **ret)
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews{
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews isc_result_t result;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(pctx != NULL);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews REQUIRE(type != NULL);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb REQUIRE(ret != NULL && *ret == NULL);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews CHECK(cfg_parse_special(pctx, '{'));
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CHECK(parse_list(pctx, type, ret));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CHECK(cfg_parse_special(pctx, '}'));
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cleanup:
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (result);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
bb5d14d7243d71e03d262ff175b355b52873e195Evan Huntvoid
bb5d14d7243d71e03d262ff175b355b52873e195Evan Huntcfg_print_bracketed_list(cfg_printer_t *pctx, const cfg_obj_t *obj) {
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt REQUIRE(pctx != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(obj != NULL);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews print_open(pctx);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 print_list(pctx, obj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 print_close(pctx);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉cfg_doc_bracketed_list(cfg_printer_t *pctx, const cfg_type_t *type) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt REQUIRE(pctx != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(type != NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_cstr(pctx, "{ ");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_doc_obj(pctx, type->of);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_cstr(pctx, "; ... }");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews/*
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews * Parse a homogeneous list whose elements are of type 'elttype'
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews * and where elements are separated by space. The list ends
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * before the first semicolon.
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 */
bb5d14d7243d71e03d262ff175b355b52873e195Evan Huntisc_result_t
bb5d14d7243d71e03d262ff175b355b52873e195Evan Huntcfg_parse_spacelist(cfg_parser_t *pctx, const cfg_type_t *listtype,
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt cfg_obj_t **ret)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉{
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_obj_t *listobj = NULL;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews const cfg_type_t *listof = listtype->of;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews isc_result_t result;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(listtype != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(ret != NULL && *ret == NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt CHECK(cfg_create_list(pctx, listtype, &listobj));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews for (;;) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt cfg_listelt_t *elt = NULL;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CHECK(cfg_peektoken(pctx, 0));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (pctx->token.type == isc_tokentype_special &&
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt pctx->token.value.as_char == ';')
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt break;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt CHECK(cfg_parse_listelt(pctx, listof, &elt));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt ISC_LIST_APPEND(listobj->value.list, elt, link);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt *ret = listobj;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_R_SUCCESS);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cleanup:
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt CLEANUP_OBJ(listobj);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews return (result);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews}
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntvoid
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_print_spacelist(cfg_printer_t *pctx, const cfg_obj_t *obj) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_list_t *list = &obj->value.list;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_listelt_t *elt;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(pctx != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(obj != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (elt = ISC_LIST_HEAD(*list);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt elt != NULL;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt elt = ISC_LIST_NEXT(elt, link)) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_obj(pctx, elt->obj);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (ISC_LIST_NEXT(elt, link) != NULL)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsisc_boolean_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_obj_islist(const cfg_obj_t *obj) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(obj != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (ISC_TF(obj->type->rep == &cfg_rep_list));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsconst cfg_listelt_t *
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_list_first(const cfg_obj_t *obj) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(obj == NULL || obj->type->rep == &cfg_rep_list);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (obj == NULL)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_LIST_HEAD(obj->value.list));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntconst cfg_listelt_t *
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_list_next(const cfg_listelt_t *elt) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(elt != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_LIST_NEXT(elt, link));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt/*
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * Return the length of a list object. If obj is NULL or is not
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * a list, return 0.
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt */
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntunsigned int
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_list_length(const cfg_obj_t *obj, isc_boolean_t recurse) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_listelt_t *elt;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt unsigned int count = 0;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (obj == NULL || !cfg_obj_islist(obj))
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (0U);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (elt = cfg_list_first(obj);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt elt != NULL;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt elt = cfg_list_next(elt)) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (recurse && cfg_obj_islist(elt->obj)) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt count += cfg_list_length(elt->obj, recurse);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt } else {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt count++;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (count);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_obj_t *
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_listelt_value(const cfg_listelt_t *elt) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(elt != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (elt->obj);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt/*
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * Maps.
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt */
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt/*
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * Parse a map body. That's something like
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt *
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * "foo 1; bar { glub; }; zap true; zap false;"
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt *
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * i.e., a sequence of option names followed by values and
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * terminated by semicolons. Used for the top level of
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * the named.conf syntax, as well as for the body of the
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * options, view, zone, and other statements.
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt */
7204d08a319cf590ae4280b8cc20999320398574Mark Andrewsisc_result_t
7204d08a319cf590ae4280b8cc20999320398574Mark Andrewscfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews{
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews const cfg_clausedef_t * const *clausesets = type->of;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews isc_result_t result;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews const cfg_clausedef_t * const *clauseset;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews const cfg_clausedef_t *clause;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_obj_t *value = NULL;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_obj_t *obj = NULL;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_obj_t *eltobj = NULL;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_obj_t *includename = NULL;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews isc_symvalue_t symval;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_list_t *list = NULL;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews REQUIRE(pctx != NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews REQUIRE(type != NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews CHECK(create_map(pctx, type, &obj));
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews obj->value.map.clausesets = clausesets;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (;;) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_listelt_t *elt;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt redo:
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt /*
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * Parse the option name and see if it is known.
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt */
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt CHECK(cfg_gettoken(pctx, 0));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (pctx->token.type != isc_tokentype_string) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_ungettoken(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt break;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt /*
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * We accept "include" statements wherever a map body
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt * clause can occur.
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt */
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (strcasecmp(TOKEN_STRING(pctx), "include") == 0) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt /*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * Turn the file name into a temporary configuration
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews * object just so that it is not overwritten by the
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * semicolon token.
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_parse_obj(pctx, &cfg_type_qstring, &includename));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(parse_semicolon(pctx));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(parser_openfile(pctx, includename->
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews value.string.base));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_destroy(pctx, &includename);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt goto redo;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt clause = NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt for (clauseset = clausesets; *clauseset != NULL; clauseset++) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt for (clause = *clauseset;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt clause->name != NULL;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt clause++) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (strcasecmp(TOKEN_STRING(pctx),
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt clause->name) == 0)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt goto done;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews done:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (clause == NULL || clause->name == NULL) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_error(pctx, CFG_LOG_NOPREP, "unknown option");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt /*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * Try to recover by parsing this option as an unknown
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * option and discarding it.
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(cfg_parse_obj(pctx, &cfg_type_unsupported, &eltobj));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_destroy(pctx, &eltobj);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CHECK(parse_semicolon(pctx));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt continue;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt /* Clause is known. */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt /* Issue warnings if appropriate */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if ((clause->flags & CFG_CLAUSEFLAG_OBSOLETE) != 0)
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_parser_warning(pctx, 0, "option '%s' is obsolete",
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt clause->name);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if ((clause->flags & CFG_CLAUSEFLAG_NOTIMP) != 0)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_warning(pctx, 0, "option '%s' is "
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "not implemented", clause->name);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if ((clause->flags & CFG_CLAUSEFLAG_NYI) != 0)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_warning(pctx, 0, "option '%s' is "
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "not implemented", clause->name);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if ((clause->flags & CFG_CLAUSEFLAG_NOOP) != 0) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_warning(pctx, 0, "option '%s' was not "
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "enabled at compile time "
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "(ignored)", clause->name);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if ((clause->flags & CFG_CLAUSEFLAG_NOTCONFIGURED) != 0) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_warning(pctx, 0, "option '%s' was not "
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "enabled at compile time",
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt clause->name);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt result = ISC_R_FAILURE;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt goto cleanup;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt /*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * Don't log options with CFG_CLAUSEFLAG_NEWDEFAULT
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * set here - we need to log the *lack* of such an option,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews * not its presence.
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews */
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews /* See if the clause already has a value; if not create one. */
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews result = isc_symtab_lookup(obj->value.map.symtab,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews clause->name, 0, &symval);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if ((clause->flags & CFG_CLAUSEFLAG_MULTI) != 0) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews /* Multivalued clause */
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_obj_t *listobj = NULL;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (result == ISC_R_NOTFOUND) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(cfg_create_list(pctx,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews &cfg_type_implicitlist,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews &listobj));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews symval.as_pointer = listobj;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews result = isc_symtab_define(obj->value.
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews map.symtab,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews clause->name,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews 1, symval,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_symexists_reject);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (result != ISC_R_SUCCESS) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews "isc_symtab_define(%s) "
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews "failed", clause->name);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_mem_put(pctx->mctx, list,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews sizeof(cfg_list_t));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews goto cleanup;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews } else {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews INSIST(result == ISC_R_SUCCESS);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews listobj = symval.as_pointer;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews elt = NULL;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(cfg_parse_listelt(pctx, clause->type, &elt));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(parse_semicolon(pctx));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews ISC_LIST_APPEND(listobj->value.list, elt, link);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews } else {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews /* Single-valued clause */
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (result == ISC_R_NOTFOUND) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_boolean_t callback =
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews ISC_TF((clause->flags &
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CFG_CLAUSEFLAG_CALLBACK) != 0);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(parse_symtab_elt(pctx, clause->name,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews clause->type,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews obj->value.map.symtab,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews callback));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(parse_semicolon(pctx));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews } else if (result == ISC_R_SUCCESS) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR, "'%s' redefined",
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews clause->name);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews result = ISC_R_EXISTS;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews goto cleanup;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews } else {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR,
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews "isc_symtab_define() failed");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews goto cleanup;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews *ret = obj;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (ISC_R_SUCCESS);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cleanup:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CLEANUP_OBJ(value);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CLEANUP_OBJ(obj);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt CLEANUP_OBJ(eltobj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CLEANUP_OBJ(includename);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (result);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static isc_result_t
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉parse_symtab_elt(cfg_parser_t *pctx, const char *name,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_type_t *elttype, isc_symtab_t *symtab,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_boolean_t callback)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt{
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews isc_result_t result;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_obj_t *obj = NULL;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb isc_symvalue_t symval;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt CHECK(cfg_parse_obj(pctx, elttype, &obj));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (callback && pctx->callback != NULL)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt CHECK(pctx->callback(name, obj, pctx->callbackarg));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt symval.as_pointer = obj;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt CHECK(isc_symtab_define(symtab, name,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt 1, symval,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_symexists_reject));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_R_SUCCESS);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cleanup:
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt CLEANUP_OBJ(obj);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (result);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb/*
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb * Parse a map; e.g., "{ foo 1; bar { glub; }; zap true; zap false; }"
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb */
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbisc_result_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewscfg_parse_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews isc_result_t result;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(pctx != NULL);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(type != NULL);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews REQUIRE(ret != NULL && *ret == NULL);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CHECK(cfg_parse_special(pctx, '{'));
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb CHECK(cfg_parse_mapbody(pctx, type, ret));
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CHECK(cfg_parse_special(pctx, '}'));
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cleanup:
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb return (result);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb}
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews/*
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * Subroutine for cfg_parse_named_map() and cfg_parse_addressed_map().
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt */
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbstatic isc_result_t
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrewsparse_any_named_map(cfg_parser_t *pctx, cfg_type_t *nametype,
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews const cfg_type_t *type, cfg_obj_t **ret)
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews{
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews isc_result_t result;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_obj_t *idobj = NULL;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews cfg_obj_t *mapobj = NULL;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews REQUIRE(pctx != NULL);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt REQUIRE(nametype != NULL);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt REQUIRE(type != NULL);
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉 REQUIRE(ret != NULL && *ret == NULL);
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉 CHECK(cfg_parse_obj(pctx, nametype, &idobj));
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉 CHECK(cfg_parse_map(pctx, type, &mapobj));
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉 mapobj->value.map.id = idobj;
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉 *ret = mapobj;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews return (result);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt cleanup:
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews CLEANUP_OBJ(idobj);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews CLEANUP_OBJ(mapobj);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews return (result);
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews/*
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt * Parse a map identified by a string name. E.g., "name { foo 1; }".
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt * Used for the "key" and "channel" statements.
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt */
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Huntisc_result_t
1d3c89483c781f0c3f8db77d3a00f9a64cdd335dMark Andrewscfg_parse_named_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (parse_any_named_map(pctx, &cfg_type_astring, type, ret));
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt}
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt/*
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * Parse a map identified by a network address.
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt * Used to be used for the "server" statement.
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt */
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntisc_result_t
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntcfg_parse_addressed_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt return (parse_any_named_map(pctx, &cfg_type_netaddr, type, ret));
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt}
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt/*
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt * Parse a map identified by a network prefix.
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt * Used for the "server" statement.
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Hunt */
b748b5e2c2fa40f758e3b35ad4f1fde99ab5e11fEvan Huntisc_result_t
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntcfg_parse_netprefix_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews return (parse_any_named_map(pctx, &cfg_type_netprefix, type, ret));
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static void
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntprint_symval(cfg_printer_t *pctx, const char *name, cfg_obj_t *obj) {
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb if ((pctx->flags & CFG_PRINTER_ONELINE) == 0)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_indent(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, name);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_obj(pctx, obj);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if ((pctx->flags & CFG_PRINTER_ONELINE) == 0)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, ";\n");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt else
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, "; ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉void
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_print_mapbody(cfg_printer_t *pctx, const cfg_obj_t *obj) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_result_t result = ISC_R_SUCCESS;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_clausedef_t * const *clauseset;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(pctx != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (clauseset = obj->value.map.clausesets;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *clauseset != NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 clauseset++)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_symvalue_t symval;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb const cfg_clausedef_t *clause;
7ee225cf90fd06de61682b442600af88b68b99dbMark Andrews
7ee225cf90fd06de61682b442600af88b68b99dbMark Andrews for (clause = *clauseset;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 clause->name != NULL;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews clause++) {
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews result = isc_symtab_lookup(obj->value.map.symtab,
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews clause->name, 0, &symval);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb if (result == ISC_R_SUCCESS) {
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb cfg_obj_t *symobj = symval.as_pointer;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews if (symobj->type == &cfg_type_implicitlist) {
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews /* Multivalued. */
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_list_t *list = &symobj->value.list;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews cfg_listelt_t *elt;
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews for (elt = ISC_LIST_HEAD(*list);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 elt != NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 elt = ISC_LIST_NEXT(elt, link)) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 print_symval(pctx,
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 clause->name,
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 elt->obj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 } else {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 /* Single-valued. */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 print_symval(pctx, clause->name,
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 symobj);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt } else if (result == ISC_R_NOTFOUND) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt ; /* do nothing */
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt } else {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt INSIST(0);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 }
7ee225cf90fd06de61682b442600af88b68b99dbMark Andrews }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static struct flagtext {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 unsigned int flag;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const char *text;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt} flagtexts[] = {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 { CFG_CLAUSEFLAG_NOTIMP, "not implemented" },
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 { CFG_CLAUSEFLAG_NYI, "not yet implemented" },
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt { CFG_CLAUSEFLAG_OBSOLETE, "obsolete" },
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 { CFG_CLAUSEFLAG_NEWDEFAULT, "default changed" },
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews { CFG_CLAUSEFLAG_TESTONLY, "test only" },
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews { CFG_CLAUSEFLAG_NOTCONFIGURED, "not configured" },
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews { CFG_CLAUSEFLAG_MULTI, "may occur multiple times" },
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews { CFG_CLAUSEFLAG_EXPERIMENTAL, "experimental" },
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews { CFG_CLAUSEFLAG_NOOP, "non-operational" },
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews { 0, NULL }
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews};
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbstatic void
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackbprint_clause_flags(cfg_printer_t *pctx, unsigned int flags) {
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb struct flagtext *p;
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb isc_boolean_t first = ISC_TRUE;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 for (p = flagtexts; p->flag != 0; p++) {
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews if ((flags & p->flag) != 0) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (first)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_print_cstr(pctx, " // ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt else
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, ", ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, p->text);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt first = ISC_FALSE;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntvoid
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_doc_mapbody(cfg_printer_t *pctx, const cfg_type_t *type) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_clausedef_t * const *clauseset;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_clausedef_t *clause;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(pctx != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(type != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (clauseset = type->of; *clauseset != NULL; clauseset++) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (clause = *clauseset;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt clause->name != NULL;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt clause++) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, clause->name);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_doc_obj(pctx, clause->type);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, ";");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_clause_flags(pctx, clause->flags);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, "\n\n");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntvoid
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_print_map(cfg_printer_t *pctx, const cfg_obj_t *obj) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(pctx != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(obj != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (obj->value.map.id != NULL) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_obj(pctx, obj->value.map.id);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_open(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_mapbody(pctx, obj);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_close(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntvoid
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_doc_map(cfg_printer_t *pctx, const cfg_type_t *type) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_clausedef_t * const *clauseset;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_clausedef_t *clause;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(pctx != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(type != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (type->parse == cfg_parse_named_map) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_doc_obj(pctx, &cfg_type_astring);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt } else if (type->parse == cfg_parse_addressed_map) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_doc_obj(pctx, &cfg_type_netaddr);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt } else if (type->parse == cfg_parse_netprefix_map) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_doc_obj(pctx, &cfg_type_netprefix);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_open(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (clauseset = type->of; *clauseset != NULL; clauseset++) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (clause = *clauseset;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt clause->name != NULL;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt clause++) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_indent(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, clause->name);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (clause->type->print != cfg_print_void)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, " ");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_doc_obj(pctx, clause->type);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, ";");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_clause_flags(pctx, clause->flags);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_print_cstr(pctx, "\n");
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt print_close(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntisc_boolean_t
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_obj_ismap(const cfg_obj_t *obj) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(obj != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_TF(obj->type->rep == &cfg_rep_map));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntisc_result_t
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_map_get(const cfg_obj_t *mapobj, const char* name, const cfg_obj_t **obj) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_result_t result;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_symvalue_t val;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt const cfg_map_t *map;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(mapobj != NULL && mapobj->type->rep == &cfg_rep_map);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(name != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL && *obj == NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt map = &mapobj->value.map;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt result = isc_symtab_lookup(map->symtab, name, MAP_SYM, &val);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (result != ISC_R_SUCCESS)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt return (result);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt *obj = val.as_pointer;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntconst cfg_obj_t *
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_map_getname(const cfg_obj_t *mapobj) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(mapobj != NULL && mapobj->type->rep == &cfg_rep_map);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (mapobj->value.map.id);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntunsigned int
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_map_count(const cfg_obj_t *mapobj) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt const cfg_map_t *map;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(mapobj != NULL && mapobj->type->rep == &cfg_rep_map);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews map = &mapobj->value.map;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (isc_symtab_count(map->symtab));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews/* Parse an arbitrary token, storing its raw text representation. */
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsstatic isc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntparse_token(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_obj_t *obj = NULL;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_region_t r;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt UNUSED(type);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_create_obj(pctx, &cfg_type_token, &obj));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.type == isc_tokentype_eof) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_ungettoken(pctx);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = ISC_R_EOF;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt goto cleanup;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
bf216589c1a81e4431653a145b252b6ce367d7cdMark Andrews isc_lex_getlasttokentext(pctx->lexer, &pctx->token, &r);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews
aeff3f0541beed6c7e384737bc83b46ea5e66a84Evan Hunt obj->value.string.base = isc_mem_get(pctx->mctx, r.length + 1);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (obj->value.string.base == NULL) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = ISC_R_NOMEMORY;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt goto cleanup;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt obj->value.string.length = r.length;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt memmove(obj->value.string.base, r.base, r.length);
bf216589c1a81e4431653a145b252b6ce367d7cdMark Andrews obj->value.string.base[r.length] = '\0';
bf216589c1a81e4431653a145b252b6ce367d7cdMark Andrews *ret = obj;
aeff3f0541beed6c7e384737bc83b46ea5e66a84Evan Hunt return (result);
aeff3f0541beed6c7e384737bc83b46ea5e66a84Evan Hunt
aeff3f0541beed6c7e384737bc83b46ea5e66a84Evan Hunt cleanup:
a70fc47e9dc165175e77f091076559748858a488Mark Andrews if (obj != NULL)
a70fc47e9dc165175e77f091076559748858a488Mark Andrews isc_mem_put(pctx->mctx, obj, sizeof(*obj));
a70fc47e9dc165175e77f091076559748858a488Mark Andrews return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_token = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "token", parse_token, cfg_print_ustring, cfg_doc_terminal,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_string, NULL
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
bf216589c1a81e4431653a145b252b6ce367d7cdMark Andrews/*
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * An unsupported option. This is just a list of tokens with balanced braces
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * ending in a semicolon.
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic isc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntparse_unsupported(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_obj_t *listobj = NULL;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt int braces = 0;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_create_list(pctx, type, &listobj));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt for (;;) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_listelt_t *elt = NULL;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
08f01297320b7ad55d0abff0aca9a577196079e2Mukund Sivaraman CHECK(cfg_peektoken(pctx, 0));
08f01297320b7ad55d0abff0aca9a577196079e2Mukund Sivaraman if (pctx->token.type == isc_tokentype_special) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.value.as_char == '{')
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt braces++;
bf216589c1a81e4431653a145b252b6ce367d7cdMark Andrews else if (pctx->token.value.as_char == '}')
bf216589c1a81e4431653a145b252b6ce367d7cdMark Andrews braces--;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt else if (pctx->token.value.as_char == ';')
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (braces == 0)
a70fc47e9dc165175e77f091076559748858a488Mark Andrews break;
a70fc47e9dc165175e77f091076559748858a488Mark Andrews }
aeff3f0541beed6c7e384737bc83b46ea5e66a84Evan Hunt if (pctx->token.type == isc_tokentype_eof || braces < 0) {
a70fc47e9dc165175e77f091076559748858a488Mark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR, "unexpected token");
a70fc47e9dc165175e77f091076559748858a488Mark Andrews result = ISC_R_UNEXPECTEDTOKEN;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt goto cleanup;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_parse_listelt(pctx, &cfg_type_token, &elt));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt ISC_LIST_APPEND(listobj->value.list, elt, link);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt INSIST(braces == 0);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *ret = listobj;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CLEANUP_OBJ(listobj);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_unsupported = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "unsupported", parse_unsupported, cfg_print_spacelist, cfg_doc_terminal,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_list, NULL
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt/*
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * Try interpreting the current token as a network address.
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * If CFG_ADDR_WILDOK is set in flags, "*" can be used as a wildcard
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * and at least one of CFG_ADDR_V4OK and CFG_ADDR_V6OK must also be set. The
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * "*" is interpreted as the IPv4 wildcard address if CFG_ADDR_V4OK is
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * set (including the case where CFG_ADDR_V4OK and CFG_ADDR_V6OK are both set),
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt * and the IPv6 wildcard address otherwise.
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic isc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunttoken_addr(cfg_parser_t *pctx, unsigned int flags, isc_netaddr_t *na) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt char *s;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt struct in_addr in4a;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt struct in6_addr in6a;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.type != isc_tokentype_string)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt s = TOKEN_STRING(pctx);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((flags & CFG_ADDR_WILDOK) != 0 && strcmp(s, "*") == 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((flags & CFG_ADDR_V4OK) != 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_any(na);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else if ((flags & CFG_ADDR_V6OK) != 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_any6(na);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt INSIST(0);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((flags & (CFG_ADDR_V4OK | CFG_ADDR_V4PREFIXOK)) != 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (inet_pton(AF_INET, s, &in4a) == 1) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_fromin(na, &in4a);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((flags & CFG_ADDR_V4PREFIXOK) != 0 && strlen(s) <= 15U) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt char buf[64];
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt int i;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt strlcpy(buf, s, sizeof(buf));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt for (i = 0; i < 3; i++) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt strlcat(buf, ".0", sizeof(buf));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (inet_pton(AF_INET, buf, &in4a) == 1) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_fromin(na, &in4a);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if ((flags & CFG_ADDR_V6OK) != 0 && strlen(s) <= 127U) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews char buf[128]; /* see lib/bind9/getaddresses.c */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt char *d; /* zone delimiter */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_uint32_t zone = 0; /* scope zone ID */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt strlcpy(buf, s, sizeof(buf));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt d = strchr(buf, '%');
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (d != NULL)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt *d = '\0';
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (inet_pton(AF_INET6, buf, &in6a) == 1) {
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (d != NULL) {
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews#ifdef ISC_PLATFORM_HAVESCOPEID
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt result = isc_netscope_pton(AF_INET6,
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt d + 1,
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt &in6a,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &zone);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (result != ISC_R_SUCCESS)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt#else
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_BADADDRESSFORM);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt#endif
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_fromin6(na, &in6a);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_setzone(na, zone);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntisc_result_t
bb5d14d7243d71e03d262ff175b355b52873e195Evan Huntcfg_parse_rawaddr(cfg_parser_t *pctx, unsigned int flags, isc_netaddr_t *na) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt const char *wild = "";
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt const char *prefix = "";
bb5d14d7243d71e03d262ff175b355b52873e195Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(na != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_gettoken(pctx, 0));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = token_addr(pctx, flags, na);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (result == ISC_R_UNEXPECTEDTOKEN) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((flags & CFG_ADDR_WILDOK) != 0)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt wild = " or '*'";
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((flags & CFG_ADDR_V4PREFIXOK) != 0)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt wild = " or IPv4 prefix";
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if ((flags & CFG_ADDR_MASK) == CFG_ADDR_V4OK)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
a70fc47e9dc165175e77f091076559748858a488Mark Andrews "expected IPv4 address%s%s",
a70fc47e9dc165175e77f091076559748858a488Mark Andrews prefix, wild);
a70fc47e9dc165175e77f091076559748858a488Mark Andrews else if ((flags & CFG_ADDR_MASK) == CFG_ADDR_V6OK)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "expected IPv6 address%s%s",
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt prefix, wild);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt else
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "expected IP address%s%s",
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt prefix, wild);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntisc_boolean_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_lookingat_netaddr(cfg_parser_t *pctx, unsigned int flags) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_t na_dummy;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = token_addr(pctx, flags, &na_dummy);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_TF(result == ISC_R_SUCCESS));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsisc_result_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_parse_rawport(cfg_parser_t *pctx, unsigned int flags, in_port_t *port) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_result_t result;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(pctx != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(port != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if ((flags & CFG_ADDR_WILDOK) != 0 &&
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews pctx->token.type == isc_tokentype_string &&
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews strcmp(TOKEN_STRING(pctx), "*") == 0) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews *port = 0;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (ISC_R_SUCCESS);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (pctx->token.type != isc_tokentype_number) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "expected port number or '*'");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.value.as_ulong >= 65536U) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "port number out of range");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *port = (in_port_t)(pctx->token.value.as_ulong);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntvoid
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_print_rawaddr(cfg_printer_t *pctx, const isc_netaddr_t *na) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt char text[128];
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_buffer_t buf;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(na != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_buffer_init(&buf, text, sizeof(text));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = isc_netaddr_totext(na, &buf);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt RUNTIME_CHECK(result == ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_print_chars(pctx, isc_buffer_base(&buf),
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_buffer_usedlength(&buf));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntisc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_parse_dscp(cfg_parser_t *pctx, isc_dscp_t *dscp) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(dscp != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER | ISC_LEXOPT_CNUMBER));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.type != isc_tokentype_number) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "expected number");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.value.as_ulong > 63U) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "dscp out of range");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_RANGE);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *dscp = (isc_dscp_t)(pctx->token.value.as_ulong);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt/* netaddr */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic unsigned int netaddr_flags = CFG_ADDR_V4OK | CFG_ADDR_V6OK;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic unsigned int netaddr4_flags = CFG_ADDR_V4OK;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic unsigned int netaddr4wild_flags = CFG_ADDR_V4OK | CFG_ADDR_WILDOK;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic unsigned int netaddr6_flags = CFG_ADDR_V6OK;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic unsigned int netaddr6wild_flags = CFG_ADDR_V6OK | CFG_ADDR_WILDOK;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic isc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntparse_netaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_obj_t *obj = NULL;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_t netaddr;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt unsigned int flags = *(const unsigned int *)type->of;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_create_obj(pctx, type, &obj));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_sockaddr_fromnetaddr(&obj->value.sockaddr, &netaddr, 0);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *ret = obj;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CLEANUP_OBJ(obj);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark Andrewsstatic void
7204d08a319cf590ae4280b8cc20999320398574Mark Andrewscfg_doc_netaddr(cfg_printer_t *pctx, const cfg_type_t *type) {
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews const unsigned int *flagp = type->of;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews int n = 0;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (*flagp != CFG_ADDR_V4OK && *flagp != CFG_ADDR_V6OK)
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_print_cstr(pctx, "( ");
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (*flagp & CFG_ADDR_V4OK) {
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_print_cstr(pctx, "<ipv4_address>");
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews n++;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews }
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (*flagp & CFG_ADDR_V6OK) {
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (n != 0)
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_print_cstr(pctx, " | ");
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_print_cstr(pctx, "<ipv6_address>");
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews n++;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews }
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (*flagp & CFG_ADDR_WILDOK) {
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (n != 0)
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_print_cstr(pctx, " | ");
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_print_cstr(pctx, "*");
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews n++;
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews POST(n);
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews }
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews if (*flagp != CFG_ADDR_V4OK && *flagp != CFG_ADDR_V6OK)
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews cfg_print_cstr(pctx, " )");
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews}
7204d08a319cf590ae4280b8cc20999320398574Mark Andrews
7204d08a319cf590ae4280b8cc20999320398574Mark AndrewsLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_netaddr = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "netaddr", parse_netaddr, cfg_print_sockaddr, cfg_doc_netaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_sockaddr, &netaddr_flags
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_netaddr4 = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "netaddr4", parse_netaddr, cfg_print_sockaddr, cfg_doc_netaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_sockaddr, &netaddr4_flags
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_netaddr4wild = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "netaddr4wild", parse_netaddr, cfg_print_sockaddr, cfg_doc_netaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_sockaddr, &netaddr4wild_flags
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_netaddr6 = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "netaddr6", parse_netaddr, cfg_print_sockaddr, cfg_doc_netaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_sockaddr, &netaddr6_flags
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_netaddr6wild = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "netaddr6wild", parse_netaddr, cfg_print_sockaddr, cfg_doc_netaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_sockaddr, &netaddr6wild_flags
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt/* netprefix */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntisc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_obj_t **ret)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt{
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_obj_t *obj = NULL;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_t netaddr;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt unsigned int addrlen = 0, prefixlen;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt UNUSED(type);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_parse_rawaddr(pctx, CFG_ADDR_V4OK | CFG_ADDR_V4PREFIXOK |
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CFG_ADDR_V6OK, &netaddr));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt switch (netaddr.family) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt case AF_INET:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt addrlen = 32;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt break;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt case AF_INET6:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt addrlen = 128;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt break;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt default:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt INSIST(0);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt break;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_peektoken(pctx, 0));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.type == isc_tokentype_special &&
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt pctx->token.value.as_char == '/') {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_gettoken(pctx, 0)); /* read "/" */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.type != isc_tokentype_number) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "expected prefix length");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt prefixlen = pctx->token.value.as_ulong;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (prefixlen > addrlen) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NOPREP,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "invalid prefix length");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_RANGE);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt prefixlen = addrlen;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_create_obj(pctx, &cfg_type_netprefix, &obj));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt obj->value.netprefix.address = netaddr;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt obj->value.netprefix.prefixlen = prefixlen;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *ret = obj;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR, "expected network prefix");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic void
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntprint_netprefix(cfg_printer_t *pctx, const cfg_obj_t *obj) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt const cfg_netprefix_t *p = &obj->value.netprefix;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_print_rawaddr(pctx, &p->address);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_print_cstr(pctx, "/");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_print_rawuint(pctx, p->prefixlen);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntisc_boolean_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_obj_isnetprefix(const cfg_obj_t *obj) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(obj != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_TF(obj->type->rep == &cfg_rep_netprefix));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntvoid
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_obj_asnetprefix(const cfg_obj_t *obj, isc_netaddr_t *netaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt unsigned int *prefixlen)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt{
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_netprefix);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(netaddr != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(prefixlen != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *netaddr = obj->value.netprefix.address;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *prefixlen = obj->value.netprefix.prefixlen;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_netprefix = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "netprefix", cfg_parse_netprefix, print_netprefix, cfg_doc_terminal,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_netprefix, NULL
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic isc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntparse_sockaddrsub(cfg_parser_t *pctx, const cfg_type_t *type,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt int flags, cfg_obj_t **ret)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt{
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_t netaddr;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt in_port_t port = 0;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_dscp_t dscp = -1;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_obj_t *obj = NULL;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt int have_port = 0, have_dscp = 0;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_create_obj(pctx, type, &obj));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt for (;;) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_peektoken(pctx, 0));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->token.type == isc_tokentype_string) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (strcasecmp(TOKEN_STRING(pctx), "port") == 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_gettoken(pctx, 0)); /* read "port" */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_parse_rawport(pctx, flags, &port));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt ++have_port;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else if ((flags & CFG_ADDR_DSCPOK) != 0 &&
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt strcasecmp(TOKEN_STRING(pctx), "dscp") == 0)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_gettoken(pctx, 0)); /* read "dscp" */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_parse_dscp(pctx, &dscp));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt ++have_dscp;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt break;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt break;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (have_port > 1) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, 0, "expected at most one port");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = ISC_R_UNEXPECTEDTOKEN;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt goto cleanup;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (have_dscp > 1) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, 0, "expected at most one dscp");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = ISC_R_UNEXPECTEDTOKEN;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt goto cleanup;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_sockaddr_fromnetaddr(&obj->value.sockaddr, &netaddr, port);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt obj->value.sockaddrdscp.dscp = dscp;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt *ret = obj;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cleanup:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CLEANUP_OBJ(obj);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic unsigned int sockaddr_flags = CFG_ADDR_V4OK | CFG_ADDR_V6OK;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_sockaddr = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "sockaddr", cfg_parse_sockaddr, cfg_print_sockaddr, cfg_doc_sockaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_sockaddr, &sockaddr_flags
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic unsigned int sockaddrdscp_flags = CFG_ADDR_V4OK | CFG_ADDR_V6OK |
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CFG_ADDR_DSCPOK;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan HuntLIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_sockaddrdscp = {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "sockaddr", cfg_parse_sockaddr, cfg_print_sockaddr, cfg_doc_sockaddr,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt &cfg_rep_sockaddr, &sockaddrdscp_flags
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt};
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntisc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_parse_sockaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt const unsigned int *flagp;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(type != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt flagp = type->of;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (parse_sockaddrsub(pctx, &cfg_type_sockaddr, *flagp, ret));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntvoid
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_t netaddr;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt in_port_t port;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt char buf[ISC_NETADDR_FORMATSIZE];
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(obj != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_fromsockaddr(&netaddr, &obj->value.sockaddr);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_netaddr_format(&netaddr, buf, sizeof(buf));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_print_cstr(pctx, buf);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt port = isc_sockaddr_getport(&obj->value.sockaddr);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (port != 0) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_cstr(pctx, " port ");
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_print_rawuint(pctx, port);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (obj->value.sockaddrdscp.dscp != -1) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, " dscp ");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_rawuint(pctx, obj->value.sockaddrdscp.dscp);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsvoid
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews const unsigned int *flagp = type->of;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews int n = 0;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(pctx != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(type != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "( ");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (*flagp & CFG_ADDR_V4OK) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "<ipv4_address>");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews n++;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (*flagp & CFG_ADDR_V6OK) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (n != 0)
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, " | ");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "<ipv6_address>");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews n++;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (*flagp & CFG_ADDR_WILDOK) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (n != 0)
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, " | ");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "*");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews n++;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews POST(n);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, " ) ");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (*flagp & CFG_ADDR_WILDOK) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "[ port ( <integer> | * ) ]");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews } else {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, "[ port <integer> ]");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if ((*flagp & CFG_ADDR_DSCPOK) != 0) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_print_cstr(pctx, " [ dscp <integer> ]");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsisc_boolean_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_obj_issockaddr(const cfg_obj_t *obj) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(obj != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (ISC_TF(obj->type->rep == &cfg_rep_sockaddr));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsconst isc_sockaddr_t *
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_obj_assockaddr(const cfg_obj_t *obj) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_sockaddr);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (&obj->value.sockaddr);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsisc_dscp_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_obj_getdscp(const cfg_obj_t *obj) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_sockaddr);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (obj->value.sockaddrdscp.dscp);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsisc_result_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_gettoken(cfg_parser_t *pctx, int options) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_result_t result;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(pctx != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (pctx->seen_eof)
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (ISC_R_SUCCESS);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews options |= (ISC_LEXOPT_EOF | ISC_LEXOPT_NOMORE);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews redo:
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews pctx->token.type = isc_tokentype_unknown;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews result = isc_lex_gettoken(pctx->lexer, options, &pctx->token);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews pctx->ungotten = ISC_FALSE;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews pctx->line = isc_lex_getsourceline(pctx->lexer);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews switch (result) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews case ISC_R_SUCCESS:
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt if (pctx->token.type == isc_tokentype_eof) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt result = isc_lex_close(pctx->lexer);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews INSIST(result == ISC_R_NOMORE ||
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews result == ISC_R_SUCCESS);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews if (isc_lex_getsourcename(pctx->lexer) != NULL) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews /*
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt * Closed an included file, not the main file.
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews */
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_listelt_t *elt;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt elt = ISC_LIST_TAIL(pctx->open_files->
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews value.list);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews INSIST(elt != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews ISC_LIST_UNLINK(pctx->open_files->
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews value.list, elt, link);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews ISC_LIST_APPEND(pctx->closed_files->
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews value.list, elt, link);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews goto redo;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews pctx->seen_eof = ISC_TRUE;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews }
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews break;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews case ISC_R_NOSPACE:
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews /* More understandable than "ran out of space". */
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR, "token too big");
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews break;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews case ISC_R_IOERROR:
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_parser_error(pctx, 0, "%s",
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_result_totext(result));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews break;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews default:
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_parser_error(pctx, CFG_LOG_NEAR, "%s",
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_result_totext(result));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt break;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntvoid
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_ungettoken(cfg_parser_t *pctx) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->seen_eof)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_lex_ungettoken(pctx->lexer, &pctx->token);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt pctx->ungotten = ISC_TRUE;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewsisc_result_t
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrewscfg_peektoken(cfg_parser_t *pctx, int options) {
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews isc_result_t result;
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews REQUIRE(pctx != NULL);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews CHECK(cfg_gettoken(pctx, options));
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cfg_ungettoken(pctx);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews cleanup:
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews return (result);
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews}
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews/*
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews * Get a string token, accepting both the quoted and the unquoted form.
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews * Log an error if the next token is not a string.
10966da999f8f7f364418aa446d8ead9c8a761cfMark Andrews */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic isc_result_t
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_getstringtoken(cfg_parser_t *pctx) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_result_t result;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt result = cfg_gettoken(pctx, CFG_LEXOPT_QSTRING);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (result != ISC_R_SUCCESS)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (result);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (pctx->token.type != isc_tokentype_string &&
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt pctx->token.type != isc_tokentype_qstring) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt cfg_parser_error(pctx, CFG_LOG_NEAR, "expected string");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_UNEXPECTEDTOKEN);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_R_SUCCESS);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntvoid
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_parser_error(cfg_parser_t *pctx, unsigned int flags, const char *fmt, ...) {
a70fc47e9dc165175e77f091076559748858a488Mark Andrews va_list args;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(fmt != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt va_start(args, fmt);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt parser_complain(pctx, ISC_FALSE, flags, fmt, args);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt va_end(args);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt pctx->errors++;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntvoid
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntcfg_parser_warning(cfg_parser_t *pctx, unsigned int flags, const char *fmt, ...) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt va_list args;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(pctx != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt REQUIRE(fmt != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt va_start(args, fmt);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt parser_complain(pctx, ISC_TRUE, flags, fmt, args);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt va_end(args);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt pctx->warnings++;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt#define MAX_LOG_TOKEN 30 /* How much of a token to quote in log messages. */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic isc_boolean_t
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunthave_current_file(cfg_parser_t *pctx) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_listelt_t *elt;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->open_files == NULL)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (ISC_FALSE);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt elt = ISC_LIST_TAIL(pctx->open_files->value.list);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (elt == NULL)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_FALSE);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_TRUE);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntstatic char *
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcurrent_file(cfg_parser_t *pctx) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt static char none[] = "none";
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_listelt_t *elt;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_obj_t *fileobj;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (!have_current_file(pctx))
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (none);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt elt = ISC_LIST_TAIL(pctx->open_files->value.list);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (elt == NULL) /* shouldn't be possible, but... */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (none);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt fileobj = elt->obj;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt INSIST(fileobj->type == &cfg_type_qstring);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (fileobj->value.string.base);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntstatic void
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Huntparser_complain(cfg_parser_t *pctx, isc_boolean_t is_warning,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt unsigned int flags, const char *format,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt va_list args)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt{
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt char tokenbuf[MAX_LOG_TOKEN + 10];
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt static char where[ISC_DIR_PATHMAX + 100];
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt static char message[2048];
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt int level = ISC_LOG_ERROR;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const char *prep = "";
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt size_t len;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (is_warning)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt level = ISC_LOG_WARNING;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt where[0] = '\0';
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (have_current_file(pctx))
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt snprintf(where, sizeof(where), "%s:%u: ",
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt current_file(pctx), pctx->line);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt else if (pctx->buf_name != NULL)
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt snprintf(where, sizeof(where), "%s: ", pctx->buf_name);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt len = vsnprintf(message, sizeof(message), format, args);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt#define ELIPSIS " ... "
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (len >= sizeof(message)) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt message[sizeof(message) - sizeof(ELIPSIS)] = 0;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt strlcat(message, ELIPSIS, sizeof(message));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if ((flags & (CFG_LOG_NEAR|CFG_LOG_BEFORE|CFG_LOG_NOPREP)) != 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isc_region_t r;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (pctx->ungotten)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt (void)cfg_gettoken(pctx, 0);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (pctx->token.type == isc_tokentype_eof) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt snprintf(tokenbuf, sizeof(tokenbuf), "end of file");
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else if (pctx->token.type == isc_tokentype_unknown) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt flags = 0;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt tokenbuf[0] = '\0';
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_lex_getlasttokentext(pctx->lexer,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt &pctx->token, &r);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (r.length > MAX_LOG_TOKEN)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt snprintf(tokenbuf, sizeof(tokenbuf),
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt "'%.*s...'", MAX_LOG_TOKEN, r.base);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt else
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt snprintf(tokenbuf, sizeof(tokenbuf),
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt "'%.*s'", (int)r.length, r.base);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt /* Choose a preposition. */
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (flags & CFG_LOG_NEAR)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt prep = " near ";
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt else if (flags & CFG_LOG_BEFORE)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt prep = " before ";
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt else
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt prep = " ";
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt } else {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt tokenbuf[0] = '\0';
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt }
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt isc_log_write(pctx->lctx, CAT, MOD, level,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt "%s%s%s%s", where, message, prep, tokenbuf);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt}
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntvoid
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Huntcfg_obj_log(const cfg_obj_t *obj, isc_log_t *lctx, int level,
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt const char *fmt, ...) {
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt va_list ap;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt char msgbuf[2048];
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(obj != NULL);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt REQUIRE(fmt != NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (! isc_log_wouldlog(lctx, level))
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 return;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt va_start(ap, fmt);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt va_end(ap);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (obj->file != NULL) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_log_write(lctx, CAT, MOD, level,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt "%s:%u: %s", obj->file, obj->line, msgbuf);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 } else {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_log_write(lctx, CAT, MOD, level, "%s", msgbuf);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntconst char *
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_obj_file(const cfg_obj_t *obj) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(obj != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (obj->file);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntunsigned int
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_obj_line(const cfg_obj_t *obj) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(obj != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (obj->line);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt}
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntisc_result_t
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_result_t result;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_obj_t *obj;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(pctx != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(type != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(ret != NULL && *ret == NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt obj = isc_mem_get(pctx->mctx, sizeof(cfg_obj_t));
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if (obj == NULL)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_R_NOMEMORY);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt obj->type = type;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt obj->file = current_file(pctx);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt obj->line = pctx->line;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt obj->pctx = pctx;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt result = isc_refcount_init(&obj->references, 1);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (result);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *ret = obj;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static void
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉map_symtabitem_destroy(char *key, unsigned int type,
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb isc_symvalue_t symval, void *userarg)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉{
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_obj_t *obj = symval.as_pointer;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_parser_t *pctx = (cfg_parser_t *)userarg;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 UNUSED(key);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 UNUSED(type);
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_obj_destroy(pctx, &obj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static isc_result_t
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_result_t result;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_symtab_t *symtab = NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_obj_t *obj = NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CHECK(cfg_create_obj(pctx, type, &obj));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CHECK(isc_symtab_create(pctx->mctx, 5, /* XXX */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 map_symtabitem_destroy,
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 pctx, ISC_FALSE, &symtab));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 obj->value.map.symtab = symtab;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 obj->value.map.id = NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *ret = obj;
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater return (ISC_R_SUCCESS);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cleanup:
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (obj != NULL)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 return (result);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static void
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉free_map(cfg_parser_t *pctx, cfg_obj_t *obj) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CLEANUP_OBJ(obj->value.map.id);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_symtab_destroy(&obj->value.map.symtab);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉isc_boolean_t
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉cfg_obj_istype(const cfg_obj_t *obj, const cfg_type_t *type) {
2fff8b8280779a25fbdb891b2d3d9b435d2084f0Tatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(obj != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(type != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 return (ISC_TF(obj->type == type));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉/*
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * Destroy 'obj', a configuration object created in 'pctx'.
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉void
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **objp) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_obj_t *obj;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 unsigned int refs;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(objp != NULL && *objp != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 obj = *objp;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_refcount_decrement(&obj->references, &refs);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (refs == 0) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 obj->type->rep->free(pctx, obj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_refcount_destroy(&obj->references);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *objp = NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉void
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updatercfg_obj_attach(cfg_obj_t *src, cfg_obj_t **dest) {
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater REQUIRE(src != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(dest != NULL && *dest == NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_refcount_increment(&src->references, NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *dest = src;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉static void
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉free_noop(cfg_parser_t *pctx, cfg_obj_t *obj) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 UNUSED(pctx);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 UNUSED(obj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉void
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉cfg_doc_obj(cfg_printer_t *pctx, const cfg_type_t *type) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(type != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 type->doc(pctx, type);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉void
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉cfg_doc_terminal(cfg_printer_t *pctx, const cfg_type_t *type) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(pctx != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(type != NULL);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_print_cstr(pctx, "<");
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_print_cstr(pctx, type->name);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_print_cstr(pctx, ">");
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉void
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉cfg_print_grammar(const cfg_type_t *type,
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 void (*f)(void *closure, const char *text, int textlen),
240e53b13217af266abb3dae8ba103614daf2bf7Mark Andrews void *closure)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉{
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_printer_t pctx;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 pctx.f = f;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 pctx.closure = closure;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 pctx.indent = 0;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 pctx.flags = 0;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_doc_obj(&pctx, type);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntisc_result_t
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Huntcfg_parser_mapadd(cfg_parser_t *pctx, cfg_obj_t *mapobj,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_obj_t *obj, const char *clausename)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt{
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_result_t result = ISC_R_SUCCESS;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_map_t *map;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt isc_symvalue_t symval;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_obj_t *destobj = NULL;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt cfg_listelt_t *elt = NULL;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_clausedef_t * const *clauseset;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt const cfg_clausedef_t *clause;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(pctx != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(mapobj != NULL && mapobj->type->rep == &cfg_rep_map);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(obj != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt REQUIRE(clausename != NULL);
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt map = &mapobj->value.map;
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt clause = NULL;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt for (clauseset = map->clausesets; *clauseset != NULL; clauseset++) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt for (clause = *clauseset; clause->name != NULL; clause++) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (strcasecmp(clause->name, clausename) == 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt goto breakout;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt }
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt breakout:
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (clause == NULL || clause->name == NULL)
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt return (ISC_R_FAILURE);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt result = isc_symtab_lookup(map->symtab, clausename, 0, &symval);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (result == ISC_R_NOTFOUND) {
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt if ((clause->flags & CFG_CLAUSEFLAG_MULTI) != 0) {
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(cfg_create_list(pctx, &cfg_type_implicitlist,
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt &destobj));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt CHECK(create_listelt(pctx, &elt));
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt cfg_obj_attach(obj, &elt->obj);
70d987def5a58ebeb8243017c0ec2e9b2c326cf4Evan Hunt ISC_LIST_APPEND(destobj->value.list, elt, link);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 symval.as_pointer = destobj;
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt } else
789252d55f025db52ee02aa933c9f09a4aadfa97Evan Hunt symval.as_pointer = obj;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CHECK(isc_symtab_define(map->symtab, clausename, 1, symval,
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_symexists_reject));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 } else {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_obj_t *destobj2 = symval.as_pointer;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 INSIST(result == ISC_R_SUCCESS);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (destobj2->type == &cfg_type_implicitlist) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CHECK(create_listelt(pctx, &elt));
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cfg_obj_attach(obj, &elt->obj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 ISC_LIST_APPEND(destobj2->value.list, elt, link);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 } else
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 result = ISC_R_EXISTS;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 destobj = NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 elt = NULL;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 cleanup:
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (elt != NULL)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 free_listelt(pctx, elt);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 CLEANUP_OBJ(destobj);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 return (result);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉}
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉