config.c revision 0eeaaaf0ae1ae2856b94886fa80f94c21e6f1bfd
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews/*
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * Copyright (C) 2001-2003 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * Permission to use, copy, modify, and/or distribute this software for any
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * purpose with or without fee is hereby granted, provided that the above
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * copyright notice and this permission notice appear in all copies.
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý *
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
a14613fce99dee3cad5bf842fd6be78f8e463582Brian Wellington * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * PERFORMANCE OF THIS SOFTWARE.
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence */
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence/* $Id: config.c,v 1.90 2008/09/04 05:56:42 marka Exp $ */
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*! \file */
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff#include <config.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <stdlib.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isc/buffer.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <isc/log.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <isc/mem.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isc/parseint.h>
dc97fe4ed08488d314ab5bc8e99ed839542cf411David Lawrence#include <isc/region.h>
dc97fe4ed08488d314ab5bc8e99ed839542cf411David Lawrence#include <isc/result.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isc/sockaddr.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <isc/string.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <isc/util.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
50453ad879d0d93854de5a3385776bd799e8f35cBob Halley#include <isccfg/namedconf.h>
50453ad879d0d93854de5a3385776bd799e8f35cBob Halley
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <dns/fixedname.h>
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellington#include <dns/name.h>
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellington#include <dns/rdataclass.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <dns/rdatatype.h>
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews#include <dns/tsig.h>
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews#include <dns/zone.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley#include <named/config.h>
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley#include <named/globals.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrews/*% default configuration */
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrewsstatic char defaultconf[] = "\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinoptions {\n\
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff# blackhole {none;};\n"
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff#ifndef WIN32
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein" coresize default;\n\
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews datasize default;\n\
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews files unlimited;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein stacksize default;\n"
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff#endif
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff" deallocate-on-exit true;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# directory <none>\n\
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff dump-file \"named_dump.db\";\n\
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff fake-iquery no;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein has-old-clients false;\n\
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington heartbeat-interval 60;\n\
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington host-statistics no;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein interface-interval 60;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein listen-on {any;};\n\
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff listen-on-v6 {none;};\n\
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff match-mapped-addresses no;\n\
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff memstatistics-file \"named.memstats\";\n\
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff multiple-cnames no;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# named-xfer <obsolete>;\n\
4108eed5092156cf0407a97a9bd8ab7775164694Brian Wellington# pid-file \"" NS_LOCALSTATEDIR "/named.pid\"; /* or /lwresd.pid */\n\
4108eed5092156cf0407a97a9bd8ab7775164694Brian Wellington port 53;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein recursing-file \"named.recursing\";\n\
3f123dcc2fe5d2cd08ca91b732741d86a4036906Brian Wellington"
3f123dcc2fe5d2cd08ca91b732741d86a4036906Brian Wellington#ifdef PATH_RANDOMDEV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein"\
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington random-device \"" PATH_RANDOMDEV "\";\n\
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#endif
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence"\
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence recursive-clients 1000;\n\
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence rrset-order {type NS order random; order cyclic; };\n\
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence serial-queries 20;\n\
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence serial-query-rate 20;\n\
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence server-id none;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein statistics-file \"named.stats\";\n\
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence statistics-interval 60;\n\
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence tcp-clients 100;\n\
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence tcp-listen-queue 3;\n\
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence# tkey-dhkey <none>\n\
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence# tkey-gssapi-credential <none>\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# tkey-domain <none>\n\
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence transfers-per-ns 2;\n\
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence transfers-in 10;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein transfers-out 10;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein treat-cr-as-space true;\n\
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence use-id-pool true;\n\
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence use-ixfr true;\n\
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence edns-udp-size 4096;\n\
2e61d171bc1fa47ea4d551b87546ebcf78f61e4aMark Andrews max-udp-size 4096;\n\
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence request-nsid false;\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews reserved-sockets 512;\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews /* view */\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews allow-notify {none;};\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews allow-update-forwarding {none;};\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews allow-query-cache { localnets; localhost; };\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews allow-query-cache-on { any; };\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein allow-recursion { localnets; localhost; };\n\
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence allow-recursion-on { any; };\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# allow-v6-synthesis <obsolete>;\n\
529ff4b4959fb157194f985394951108ff5286e4Brian Wellington# sortlist <none>\n\
a14613fce99dee3cad5bf842fd6be78f8e463582Brian Wellington# topology <none>\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein auth-nxdomain false;\n\
489b76292622f5bc18bf1a18845f8166a73bd797Brian Wellington minimal-responses false;\n\
489b76292622f5bc18bf1a18845f8166a73bd797Brian Wellington recursion true;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein provide-ixfr true;\n\
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews request-ixfr true;\n\
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews fetch-glue no;\n\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein rfc2308-type1 no;\n\
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson additional-from-auth true;\n\
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson additional-from-cache true;\n\
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews query-source address *;\n\
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews query-source-v6 address *;\n\
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews notify-source *;\n\
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt notify-source-v6 *;\n\
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt cleaning-interval 0; /* now meaningless */\n\
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews min-roots 2;\n\
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews lame-ttl 600;\n\
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews max-ncache-ttl 10800; /* 3 hours */\n\
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews max-cache-ttl 604800; /* 1 week */\n\
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews transfer-format many-answers;\n\
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews# max-cache-size default; /* set default in server.c */\n\
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews check-names master fail;\n\
f02c22d58ac88777655e0b407b22b07864d39184Evan Hunt check-names slave warn;\n\
f02c22d58ac88777655e0b407b22b07864d39184Evan Hunt check-names response ignore;\n\
f02c22d58ac88777655e0b407b22b07864d39184Evan Hunt check-mx warn;\n\
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater acache-enable no;\n\
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater acache-cleaning-interval 60;\n\
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater max-acache-size 16M;\n\
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews dnssec-enable yes;\n\
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews dnssec-validation yes; \n\
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews dnssec-accept-expired no;\n\
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt clients-per-query 10;\n\
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt max-clients-per-query 100;\n\
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt zero-no-soa-ttl-cache no;\n\
9a97696b543b9957049a663b4f73245589c47921Mark Andrews"
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews" /* zone */\n\
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews allow-query {any;};\n\
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews allow-query-on {any;};\n\
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews allow-transfer {any;};\n\
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews notify yes;\n\
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews# also-notify <none>\n\
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews notify-delay 5;\n\
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews notify-to-soa no;\n\
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews dialup no;\n\
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews# forward <none>\n\
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews# forwarders <none>\n\
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews maintain-ixfr-base no;\n\
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki# max-ixfr-log-size <obsolete>\n\
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki transfer-source *;\n\
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki transfer-source-v6 *;\n\
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews alt-transfer-source *;\n\
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews alt-transfer-source-v6 *;\n\
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews max-transfer-time-in 120;\n\
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews max-transfer-time-out 120;\n\
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews max-transfer-idle-in 60;\n\
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews max-transfer-idle-out 60;\n\
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews max-retry-time 1209600; /* 2 weeks */\n\
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews min-retry-time 500;\n\
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews max-refresh-time 2419200; /* 4 weeks */\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews min-refresh-time 300;\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews multi-master no;\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews sig-validity-interval 30; /* days */\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews sig-signing-nodes 100;\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews sig-signing-signatures 10;\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews sig-signing-type 65535;\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews zone-statistics false;\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews max-journal-size unlimited;\n\
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews ixfr-from-differences false;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn check-wildcard yes;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn check-sibling yes;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn check-integrity yes;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn check-mx-cname warn;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn check-srv-cname warn;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn zero-no-soa-ttl yes;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn update-check-ksk yes;\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn try-tcp-refresh yes; /* BIND 8 compat */\n\
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn};\n\
a16f42441a0bdfc911aafe841a975af55181f2f0Mukund Sivaraman"
a16f42441a0bdfc911aafe841a975af55181f2f0Mukund Sivaraman
a16f42441a0bdfc911aafe841a975af55181f2f0Mukund Sivaraman"#\n\
d1dbf6b20fdcfa95acd75cdb96fcd57067a31144Mukund Sivaraman# Zones in the \"_bind\" view are NOT counted in the count of zones.\n\
d1dbf6b20fdcfa95acd75cdb96fcd57067a31144Mukund Sivaraman#\n\
d1dbf6b20fdcfa95acd75cdb96fcd57067a31144Mukund Sivaramanview \"_bind\" chaos {\n\
9935447b51456f598b45246d0114b8006049244dMark Andrews recursion no;\n\
9935447b51456f598b45246d0114b8006049244dMark Andrews notify no;\n\
9935447b51456f598b45246d0114b8006049244dMark Andrews\n\
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt zone \"version.bind\" chaos {\n\
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt type master;\n\
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt database \"_builtin version\";\n\
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews };\n\
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews\n\
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews zone \"hostname.bind\" chaos {\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews type master;\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews database \"_builtin hostname\";\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews };\n\
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews\n\
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington zone \"authors.bind\" chaos {\n\
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington type master;\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews database \"_builtin authors\";\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews };\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews zone \"id.server\" chaos {\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews type master;\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews database \"_builtin id\";\n\
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews };\n\
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt};\n\
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt";
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsisc_result_t
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsns_config_parsedefaults(cfg_parser_t *parser, cfg_obj_t **conf) {
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews isc_buffer_t b;
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn isc_buffer_init(&b, defaultconf, sizeof(defaultconf) - 1);
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn isc_buffer_add(&b, sizeof(defaultconf) - 1);
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn return (cfg_parse_buffer(parser, &b, &cfg_type_namedconf, conf));
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn}
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn
9a97696b543b9957049a663b4f73245589c47921Mark Andrewsisc_result_t
9a97696b543b9957049a663b4f73245589c47921Mark Andrewsns_config_get(const cfg_obj_t **maps, const char *name, const cfg_obj_t **obj) {
9a97696b543b9957049a663b4f73245589c47921Mark Andrews int i;
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews for (i = 0;; i++) {
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews if (maps[i] == NULL)
9a97696b543b9957049a663b4f73245589c47921Mark Andrews return (ISC_R_NOTFOUND);
9a97696b543b9957049a663b4f73245589c47921Mark Andrews if (cfg_map_get(maps[i], name, obj) == ISC_R_SUCCESS)
9a97696b543b9957049a663b4f73245589c47921Mark Andrews return (ISC_R_SUCCESS);
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman }
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman}
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsisc_result_t
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halleyns_checknames_get(const cfg_obj_t **maps, const char *which,
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley const cfg_obj_t **obj)
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User{
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User const cfg_listelt_t *element;
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User const cfg_obj_t *checknames;
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews const cfg_obj_t *type;
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews const cfg_obj_t *value;
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews int i;
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews for (i = 0;; i++) {
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews if (maps[i] == NULL)
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt return (ISC_R_NOTFOUND);
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt checknames = NULL;
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt if (cfg_map_get(maps[i], "check-names", &checknames) == ISC_R_SUCCESS) {
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt /*
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt * Zone map entry is not a list.
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt */
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt if (checknames != NULL && !cfg_obj_islist(checknames)) {
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt *obj = checknames;
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt return (ISC_R_SUCCESS);
8bcd80824c51c802c2927236b012cd526f569b04Mark Andrews }
8bcd80824c51c802c2927236b012cd526f569b04Mark Andrews for (element = cfg_list_first(checknames);
8bcd80824c51c802c2927236b012cd526f569b04Mark Andrews element != NULL;
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont element = cfg_list_next(element)) {
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont value = cfg_listelt_value(element);
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont type = cfg_tuple_get(value, "type");
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews if (strcasecmp(cfg_obj_asstring(type), which) == 0) {
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews *obj = cfg_tuple_get(value, "mode");
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews return (ISC_R_SUCCESS);
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt }
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt }
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews }
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews }
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews}
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Huntint
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Huntns_config_listcount(const cfg_obj_t *list) {
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont const cfg_listelt_t *e;
70be3889746884692aa49939833d624ddd432bf0Mark Andrews int i = 0;
70be3889746884692aa49939833d624ddd432bf0Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews for (e = cfg_list_first(list); e != NULL; e = cfg_list_next(e))
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews i++;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (i);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt}
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrewsisc_result_t
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrewsns_config_getclass(const cfg_obj_t *classobj, dns_rdataclass_t defclass,
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrews dns_rdataclass_t *classp) {
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews isc_textregion_t r;
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews isc_result_t result;
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews if (!cfg_obj_isstring(classobj)) {
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews *classp = defclass;
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews return (ISC_R_SUCCESS);
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews }
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews DE_CONST(cfg_obj_asstring(classobj), r.base);
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews r.length = strlen(r.base);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews result = dns_rdataclass_fromtext(classp, &r);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (result != ISC_R_SUCCESS)
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews cfg_obj_log(classobj, ns_g_lctx, ISC_LOG_ERROR,
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt "unknown class '%s'", r.base);
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt return (result);
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt}
9a97696b543b9957049a663b4f73245589c47921Mark Andrews
9a97696b543b9957049a663b4f73245589c47921Mark Andrewsisc_result_t
9a97696b543b9957049a663b4f73245589c47921Mark Andrewsns_config_gettype(const cfg_obj_t *typeobj, dns_rdatatype_t deftype,
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews dns_rdatatype_t *typep) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_textregion_t r;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_result_t result;
d5518bf5bc1830f89f411288f39c5c9e6eb7511cMark Andrews
d5518bf5bc1830f89f411288f39c5c9e6eb7511cMark Andrews if (!cfg_obj_isstring(typeobj)) {
d5518bf5bc1830f89f411288f39c5c9e6eb7511cMark Andrews *typep = deftype;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews return (ISC_R_SUCCESS);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews DE_CONST(cfg_obj_asstring(typeobj), r.base);
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews r.length = strlen(r.base);
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews result = dns_rdatatype_fromtext(typep, &r);
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews if (result != ISC_R_SUCCESS)
23ac30603a7639bea1d331537634b079b046b122Mark Andrews cfg_obj_log(typeobj, ns_g_lctx, ISC_LOG_ERROR,
23ac30603a7639bea1d331537634b079b046b122Mark Andrews "unknown type '%s'", r.base);
23ac30603a7639bea1d331537634b079b046b122Mark Andrews return (result);
6fa84a3e255ef9e6233f0a8d134fc6d273f04599Evan Hunt}
6fa84a3e255ef9e6233f0a8d134fc6d273f04599Evan Hunt
6fa84a3e255ef9e6233f0a8d134fc6d273f04599Evan Huntdns_zonetype_t
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsns_config_getzonetype(const cfg_obj_t *zonetypeobj) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews dns_zonetype_t ztype = dns_zone_none;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews const char *str;
c870001ae1bff0e38f622c4ed56872c7f1d2d336Mark Andrews
c870001ae1bff0e38f622c4ed56872c7f1d2d336Mark Andrews str = cfg_obj_asstring(zonetypeobj);
c870001ae1bff0e38f622c4ed56872c7f1d2d336Mark Andrews if (strcasecmp(str, "master") == 0)
186e7f37c9fc985a7a7264cc8170e48a25bed434Mark Andrews ztype = dns_zone_master;
186e7f37c9fc985a7a7264cc8170e48a25bed434Mark Andrews else if (strcasecmp(str, "slave") == 0)
186e7f37c9fc985a7a7264cc8170e48a25bed434Mark Andrews ztype = dns_zone_slave;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews else if (strcasecmp(str, "stub") == 0)
5c00d1c90030a311d2700970fa7cffc8f828a48cBob Halley ztype = dns_zone_stub;
850b5e80930907e4747347201dc41e4d04e036f8Mark Andrews else
850b5e80930907e4747347201dc41e4d04e036f8Mark Andrews INSIST(0);
850b5e80930907e4747347201dc41e4d04e036f8Mark Andrews return (ztype);
850b5e80930907e4747347201dc41e4d04e036f8Mark Andrews}
850b5e80930907e4747347201dc41e4d04e036f8Mark Andrews
850b5e80930907e4747347201dc41e4d04e036f8Mark Andrewsisc_result_t
5c00d1c90030a311d2700970fa7cffc8f828a48cBob Halleyns_config_getiplist(const cfg_obj_t *config, const cfg_obj_t *list,
c174d5c13c03dd59283243e3fd5461d41140a798Evan Hunt in_port_t defport, isc_mem_t *mctx,
c174d5c13c03dd59283243e3fd5461d41140a798Evan Hunt isc_sockaddr_t **addrsp, isc_uint32_t *countp)
c174d5c13c03dd59283243e3fd5461d41140a798Evan Hunt{
801707fe19600313a0b1f7845a518100f69e58b6Evan Hunt int count, i = 0;
801707fe19600313a0b1f7845a518100f69e58b6Evan Hunt const cfg_obj_t *addrlist;
801707fe19600313a0b1f7845a518100f69e58b6Evan Hunt const cfg_obj_t *portobj;
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews const cfg_listelt_t *element;
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews isc_sockaddr_t *addrs;
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews in_port_t port;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_result_t result;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews INSIST(addrsp != NULL && *addrsp == NULL);
5506903c9215faf42586307c2288942fd804c579Evan Hunt INSIST(countp != NULL);
5506903c9215faf42586307c2288942fd804c579Evan Hunt
5506903c9215faf42586307c2288942fd804c579Evan Hunt addrlist = cfg_tuple_get(list, "addresses");
9935447b51456f598b45246d0114b8006049244dMark Andrews count = ns_config_listcount(addrlist);
9935447b51456f598b45246d0114b8006049244dMark Andrews
9935447b51456f598b45246d0114b8006049244dMark Andrews portobj = cfg_tuple_get(list, "port");
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (cfg_obj_isuint32(portobj)) {
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson isc_uint32_t val = cfg_obj_asuint32(portobj);
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson if (val > ISC_UINT16_MAX) {
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews cfg_obj_log(portobj, ns_g_lctx, ISC_LOG_ERROR,
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews "port '%u' out of range", val);
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews return (ISC_R_RANGE);
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt }
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt port = (in_port_t) val;
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt } else if (defport != 0)
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrews port = defport;
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrews else {
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrews result = ns_config_getport(config, &port);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont if (result != ISC_R_SUCCESS)
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont return (result);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont }
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont addrs = isc_mem_get(mctx, count * sizeof(isc_sockaddr_t));
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont if (addrs == NULL)
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt return (ISC_R_NOMEMORY);
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt for (element = cfg_list_first(addrlist);
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrews element != NULL;
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrews element = cfg_list_next(element), i++)
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrews {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt INSIST(i < count);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt addrs[i] = *cfg_obj_assockaddr(cfg_listelt_value(element));
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (isc_sockaddr_getport(&addrs[i]) == 0)
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont isc_sockaddr_setport(&addrs[i], port);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont }
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont INSIST(i == count);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont *addrsp = addrs;
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont *countp = count;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt return (ISC_R_SUCCESS);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt}
8cbf3b6fc35091abde426930f2eadb8f53476c98Evan Hunt
8cbf3b6fc35091abde426930f2eadb8f53476c98Evan Huntvoid
8cbf3b6fc35091abde426930f2eadb8f53476c98Evan Huntns_config_putiplist(isc_mem_t *mctx, isc_sockaddr_t **addrsp,
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt isc_uint32_t count)
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt{
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt INSIST(addrsp != NULL && *addrsp != NULL);
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt isc_mem_put(mctx, *addrsp, count * sizeof(isc_sockaddr_t));
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt *addrsp = NULL;
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt}
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Hunt
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Huntstatic isc_result_t
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrewsget_masters_def(const cfg_obj_t *cctx, const char *name,
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews const cfg_obj_t **ret)
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews{
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews isc_result_t result;
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews const cfg_obj_t *masters = NULL;
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews const cfg_listelt_t *elt;
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Hunt
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Hunt result = cfg_map_get(cctx, "masters", &masters);
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Hunt if (result != ISC_R_SUCCESS)
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews return (result);
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews for (elt = cfg_list_first(masters);
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews elt != NULL;
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews elt = cfg_list_next(elt)) {
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews const cfg_obj_t *list;
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews const char *listname;
31b7a2fed64e388db772a74742a4adc95d1a21e6Mark Andrews
31b7a2fed64e388db772a74742a4adc95d1a21e6Mark Andrews list = cfg_listelt_value(elt);
31b7a2fed64e388db772a74742a4adc95d1a21e6Mark Andrews listname = cfg_obj_asstring(cfg_tuple_get(list, "name"));
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews if (strcasecmp(listname, name) == 0) {
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews *ret = list;
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews return (ISC_R_SUCCESS);
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews }
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews }
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt return (ISC_R_NOTFOUND);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt}
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Huntisc_result_t
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Huntns_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt isc_mem_t *mctx, isc_sockaddr_t **addrsp,
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews dns_name_t ***keysp, isc_uint32_t *countp)
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews{
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews isc_uint32_t addrcount = 0, keycount = 0, i = 0;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt isc_uint32_t listcount = 0, l = 0, j;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt isc_uint32_t stackcount = 0, pushed = 0;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt isc_result_t result;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt const cfg_listelt_t *element;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt const cfg_obj_t *addrlist;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt const cfg_obj_t *portobj;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews in_port_t port;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews dns_fixedname_t fname;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_sockaddr_t *addrs = NULL;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews dns_name_t **keys = NULL;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews struct { const char *name; } *lists = NULL;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews struct {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews const cfg_listelt_t *element;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews in_port_t port;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews } *stack = NULL;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews REQUIRE(addrsp != NULL && *addrsp == NULL);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews REQUIRE(keysp != NULL && *keysp == NULL);
dc2a0aa7aaa8b85398ae183c7274c0eeec5009afMark Andrews REQUIRE(countp != NULL);
dc2a0aa7aaa8b85398ae183c7274c0eeec5009afMark Andrews
dc2a0aa7aaa8b85398ae183c7274c0eeec5009afMark Andrews newlist:
101a7960b7989a18d873f3302b3b2415aeafb108Mark Andrews addrlist = cfg_tuple_get(list, "addresses");
101a7960b7989a18d873f3302b3b2415aeafb108Mark Andrews portobj = cfg_tuple_get(list, "port");
101a7960b7989a18d873f3302b3b2415aeafb108Mark Andrews if (cfg_obj_isuint32(portobj)) {
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrews isc_uint32_t val = cfg_obj_asuint32(portobj);
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrews if (val > ISC_UINT16_MAX) {
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrews cfg_obj_log(portobj, ns_g_lctx, ISC_LOG_ERROR,
5506903c9215faf42586307c2288942fd804c579Evan Hunt "port '%u' out of range", val);
5506903c9215faf42586307c2288942fd804c579Evan Hunt result = ISC_R_RANGE;
5506903c9215faf42586307c2288942fd804c579Evan Hunt goto cleanup;
2b50e0d877db0d668f363d50914232f82ad8c454Mark Andrews }
2b50e0d877db0d668f363d50914232f82ad8c454Mark Andrews port = (in_port_t) val;
2b50e0d877db0d668f363d50914232f82ad8c454Mark Andrews } else {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews result = ns_config_getport(config, &port);
f8727bd90366af835f551da1b5e1fdfcd2d3d01fBrian Wellington if (result != ISC_R_SUCCESS)
f8727bd90366af835f551da1b5e1fdfcd2d3d01fBrian Wellington goto cleanup;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f8727bd90366af835f551da1b5e1fdfcd2d3d01fBrian Wellington
134ba0e08a0ae9a564a8d8628fc633377d3fc239Bob Halley result = ISC_R_NOMEMORY;
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews element = cfg_list_first(addrlist);
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrews resume:
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews for ( ;
203596d27c225ea195e4faad4f19388c6e96ac80Bob Halley element != NULL;
203596d27c225ea195e4faad4f19388c6e96ac80Bob Halley element = cfg_list_next(element))
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews const cfg_obj_t *addr;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews const cfg_obj_t *key;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews const char *keystr;
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson isc_buffer_t b;
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews addr = cfg_tuple_get(cfg_listelt_value(element),
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley "masterselement");
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley key = cfg_tuple_get(cfg_listelt_value(element), "key");
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (!cfg_obj_issockaddr(addr)) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews const char *listname = cfg_obj_asstring(addr);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews isc_result_t tresult;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews /* Grow lists? */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (listcount == l) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews void * new;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_uint32_t newlen = listcount + 16;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews size_t newsize, oldsize;
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley
15bfd48fc5552ff1aae766021f42a250c001a098Michael Graff newsize = newlen * sizeof(*lists);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater oldsize = listcount * sizeof(*lists);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater new = isc_mem_get(mctx, newsize);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if (new == NULL)
a239044323418956d7d48c14d61d19f721cc5ba5Witold Krecicki goto cleanup;
a239044323418956d7d48c14d61d19f721cc5ba5Witold Krecicki if (listcount != 0) {
a239044323418956d7d48c14d61d19f721cc5ba5Witold Krecicki memcpy(new, lists, oldsize);
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews isc_mem_put(mctx, lists, oldsize);
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews }
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews lists = new;
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews listcount = newlen;
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews }
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews /* Seen? */
c4e59874fb1a750880d5ebed560c9acf69251840Mark Andrews for (j = 0; j < l; j++)
9a97696b543b9957049a663b4f73245589c47921Mark Andrews if (strcasecmp(lists[j].name, listname) == 0)
e7fb847ed570dd8c1bcdacabb3d69bd81feb79aeMark Andrews break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (j < l)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 continue;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 tresult = get_masters_def(config, listname, &list);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (tresult == ISC_R_NOTFOUND) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 cfg_obj_log(addr, ns_g_lctx, ISC_LOG_ERROR,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 "masters \"%s\" not found", listname);
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews result = tresult;
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews goto cleanup;
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark Andrews }
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark Andrews if (tresult != ISC_R_SUCCESS)
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark Andrews goto cleanup;
422009fe5b15e31e7f5d09212bd1480121a1464eEvan Hunt lists[l++].name = listname;
422009fe5b15e31e7f5d09212bd1480121a1464eEvan Hunt /* Grow stack? */
422009fe5b15e31e7f5d09212bd1480121a1464eEvan Hunt if (stackcount == pushed) {
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews void * new;
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_uint32_t newlen = stackcount + 16;
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews size_t newsize, oldsize;
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
9a97696b543b9957049a663b4f73245589c47921Mark Andrews newsize = newlen * sizeof(*stack);
9a97696b543b9957049a663b4f73245589c47921Mark Andrews oldsize = stackcount * sizeof(*stack);
588f79e557cd66ef77c90378a997b0d377af9db7Tatuya JINMEI 神明達哉 new = isc_mem_get(mctx, newsize);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews if (new == NULL)
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews goto cleanup;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews if (stackcount != 0) {
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews memcpy(new, stack, oldsize);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_mem_put(mctx, stack, oldsize);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
882350d11c90de9de6fc1cead25690c8114b0b95Michael Graff stack = new;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews stackcount = newlen;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
15bfd48fc5552ff1aae766021f42a250c001a098Michael Graff /*
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews * We want to resume processing this list on the
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews * next element.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews stack[pushed].element = cfg_list_next(element);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews stack[pushed].port = port;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews pushed++;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater goto newlist;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater }
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (i == addrcount) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews void * new;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_uint32_t newlen = addrcount + 16;
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews size_t newsize, oldsize;
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews newsize = newlen * sizeof(isc_sockaddr_t);
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews oldsize = addrcount * sizeof(isc_sockaddr_t);
12bf5d4796505b4c20680531da96a31e6c2c1144Evan Hunt new = isc_mem_get(mctx, newsize);
12bf5d4796505b4c20680531da96a31e6c2c1144Evan Hunt if (new == NULL)
12bf5d4796505b4c20680531da96a31e6c2c1144Evan Hunt goto cleanup;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if (addrcount != 0) {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater memcpy(new, addrs, oldsize);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater isc_mem_put(mctx, addrs, oldsize);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews addrs = new;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews addrcount = newlen;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews newsize = newlen * sizeof(dns_name_t *);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews oldsize = keycount * sizeof(dns_name_t *);
6a3fa181d1253db5191139e20231512eebaddeebEvan Hunt new = isc_mem_get(mctx, newsize);
6a3fa181d1253db5191139e20231512eebaddeebEvan Hunt if (new == NULL)
6a3fa181d1253db5191139e20231512eebaddeebEvan Hunt goto cleanup;
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews if (keycount != 0) {
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews memcpy(new, keys, oldsize);
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews isc_mem_put(mctx, keys, oldsize);
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews }
1783676a64b8e390b756d775ae152509f1d76719Mukund Sivaraman keys = new;
1783676a64b8e390b756d775ae152509f1d76719Mukund Sivaraman keycount = newlen;
1783676a64b8e390b756d775ae152509f1d76719Mukund Sivaraman }
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews addrs[i] = *cfg_obj_assockaddr(addr);
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews if (isc_sockaddr_getport(&addrs[i]) == 0)
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater isc_sockaddr_setport(&addrs[i], port);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater keys[i] = NULL;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if (!cfg_obj_isstring(key)) {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater i++;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater continue;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater }
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater keys[i] = isc_mem_get(mctx, sizeof(dns_name_t));
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if (keys[i] == NULL)
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater goto cleanup;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater dns_name_init(keys[i], NULL);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews keystr = cfg_obj_asstring(key);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_buffer_init(&b, keystr, strlen(keystr));
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isc_buffer_add(&b, strlen(keystr));
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews dns_fixedname_init(&fname);
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews dns_rootname, ISC_FALSE, NULL);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (result != ISC_R_SUCCESS)
7de2c6e6d51f38daeb2d346f3f21dc01ccece6daEvan Hunt goto cleanup;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews result = dns_name_dup(dns_fixedname_name(&fname), mctx,
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews keys[i]);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (result != ISC_R_SUCCESS)
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews goto cleanup;
6e9efadbea9febb0494e713e54dfea6f7ef70383Mark Andrews i++;
6e9efadbea9febb0494e713e54dfea6f7ef70383Mark Andrews }
6e9efadbea9febb0494e713e54dfea6f7ef70383Mark Andrews if (pushed != 0) {
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrews pushed--;
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrews element = stack[pushed].element;
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrews port = stack[pushed].port;
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrews goto resume;
}
if (i < addrcount) {
void * new;
size_t newsize, oldsize;
newsize = i * sizeof(isc_sockaddr_t);
oldsize = addrcount * sizeof(isc_sockaddr_t);
if (i != 0) {
new = isc_mem_get(mctx, newsize);
if (new == NULL)
goto cleanup;
memcpy(new, addrs, newsize);
} else
new = NULL;
isc_mem_put(mctx, addrs, oldsize);
addrs = new;
addrcount = i;
newsize = i * sizeof(dns_name_t *);
oldsize = keycount * sizeof(dns_name_t *);
if (i != 0) {
new = isc_mem_get(mctx, newsize);
if (new == NULL)
goto cleanup;
memcpy(new, keys, newsize);
} else
new = NULL;
isc_mem_put(mctx, keys, oldsize);
keys = new;
keycount = i;
}
if (lists != NULL)
isc_mem_put(mctx, lists, listcount * sizeof(*lists));
if (stack != NULL)
isc_mem_put(mctx, stack, stackcount * sizeof(*stack));
INSIST(keycount == addrcount);
*addrsp = addrs;
*keysp = keys;
*countp = addrcount;
return (ISC_R_SUCCESS);
cleanup:
if (addrs != NULL)
isc_mem_put(mctx, addrs, addrcount * sizeof(isc_sockaddr_t));
if (keys != NULL) {
for (j = 0; j <= i; j++) {
if (keys[j] == NULL)
continue;
if (dns_name_dynamic(keys[j]))
dns_name_free(keys[j], mctx);
isc_mem_put(mctx, keys[j], sizeof(dns_name_t));
}
isc_mem_put(mctx, keys, keycount * sizeof(dns_name_t *));
}
if (lists != NULL)
isc_mem_put(mctx, lists, listcount * sizeof(*lists));
if (stack != NULL)
isc_mem_put(mctx, stack, stackcount * sizeof(*stack));
return (result);
}
void
ns_config_putipandkeylist(isc_mem_t *mctx, isc_sockaddr_t **addrsp,
dns_name_t ***keysp, isc_uint32_t count)
{
unsigned int i;
dns_name_t **keys = *keysp;
INSIST(addrsp != NULL && *addrsp != NULL);
isc_mem_put(mctx, *addrsp, count * sizeof(isc_sockaddr_t));
for (i = 0; i < count; i++) {
if (keys[i] == NULL)
continue;
if (dns_name_dynamic(keys[i]))
dns_name_free(keys[i], mctx);
isc_mem_put(mctx, keys[i], sizeof(dns_name_t));
}
isc_mem_put(mctx, *keysp, count * sizeof(dns_name_t *));
*addrsp = NULL;
*keysp = NULL;
}
isc_result_t
ns_config_getport(const cfg_obj_t *config, in_port_t *portp) {
const cfg_obj_t *maps[3];
const cfg_obj_t *options = NULL;
const cfg_obj_t *portobj = NULL;
isc_result_t result;
int i;
(void)cfg_map_get(config, "options", &options);
i = 0;
if (options != NULL)
maps[i++] = options;
maps[i++] = ns_g_defaults;
maps[i] = NULL;
result = ns_config_get(maps, "port", &portobj);
INSIST(result == ISC_R_SUCCESS);
if (cfg_obj_asuint32(portobj) >= ISC_UINT16_MAX) {
cfg_obj_log(portobj, ns_g_lctx, ISC_LOG_ERROR,
"port '%u' out of range",
cfg_obj_asuint32(portobj));
return (ISC_R_RANGE);
}
*portp = (in_port_t)cfg_obj_asuint32(portobj);
return (ISC_R_SUCCESS);
}
struct keyalgorithms {
const char *str;
enum { hmacnone, hmacmd5, hmacsha1, hmacsha224,
hmacsha256, hmacsha384, hmacsha512 } hmac;
isc_uint16_t size;
} algorithms[] = {
{ "hmac-md5", hmacmd5, 128 },
{ "hmac-md5.sig-alg.reg.int", hmacmd5, 0 },
{ "hmac-md5.sig-alg.reg.int.", hmacmd5, 0 },
{ "hmac-sha1", hmacsha1, 160 },
{ "hmac-sha224", hmacsha224, 224 },
{ "hmac-sha256", hmacsha256, 256 },
{ "hmac-sha384", hmacsha384, 384 },
{ "hmac-sha512", hmacsha512, 512 },
{ NULL, hmacnone, 0 }
};
isc_result_t
ns_config_getkeyalgorithm(const char *str, dns_name_t **name,
isc_uint16_t *digestbits)
{
int i;
size_t len = 0;
isc_uint16_t bits;
isc_result_t result;
for (i = 0; algorithms[i].str != NULL; i++) {
len = strlen(algorithms[i].str);
if (strncasecmp(algorithms[i].str, str, len) == 0 &&
(str[len] == '\0' ||
(algorithms[i].size != 0 && str[len] == '-')))
break;
}
if (algorithms[i].str == NULL)
return (ISC_R_NOTFOUND);
if (str[len] == '-') {
result = isc_parse_uint16(&bits, str + len + 1, 10);
if (result != ISC_R_SUCCESS)
return (result);
if (bits > algorithms[i].size)
return (ISC_R_RANGE);
} else if (algorithms[i].size == 0)
bits = 128;
else
bits = algorithms[i].size;
if (name != NULL) {
switch (algorithms[i].hmac) {
case hmacmd5: *name = dns_tsig_hmacmd5_name; break;
case hmacsha1: *name = dns_tsig_hmacsha1_name; break;
case hmacsha224: *name = dns_tsig_hmacsha224_name; break;
case hmacsha256: *name = dns_tsig_hmacsha256_name; break;
case hmacsha384: *name = dns_tsig_hmacsha384_name; break;
case hmacsha512: *name = dns_tsig_hmacsha512_name; break;
default:
INSIST(0);
}
}
if (digestbits != NULL)
*digestbits = bits;
return (ISC_R_SUCCESS);
}