2 * Copyright (C) 2004, 2005, 2007, 2009, 2014, 2015 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1999-2001, 2003 Internet Software Consortium.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
18 /* $Id: afsdb_18.c,v 1.49 2009/12/04 22:06:37 tbox Exp $ */
20 /* Reviewed: Wed Mar 15 14:59:00 PST 2000 by explorer */
24 #ifndef RDATA_GENERIC_AFSDB_18_C
25 #define RDATA_GENERIC_AFSDB_18_C
27 #define RRTYPE_AFSDB_ATTRIBUTES (0)
29 static inline isc_result_t
30 fromtext_afsdb(ARGS_FROMTEXT) {
36 REQUIRE(type == dns_rdatatype_afsdb);
45 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
47 if (token.value.as_ulong > 0xffffU)
49 RETERR(uint16_tobuffer(token.value.as_ulong, target));
54 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
56 dns_name_init(&name, NULL);
57 buffer_fromregion(&buffer, &token.value.as_region);
59 origin = dns_rootname;
60 RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target));
62 if ((options & DNS_RDATA_CHECKNAMES) != 0)
63 ok = dns_name_ishostname(&name, ISC_FALSE);
64 if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0)
65 RETTOK(DNS_R_BADNAME);
66 if (!ok && callbacks != NULL)
67 warn_badname(&name, lexer, callbacks);
68 return (ISC_R_SUCCESS);
71 static inline isc_result_t
72 totext_afsdb(ARGS_TOTEXT) {
76 char buf[sizeof("64000 ")];
80 REQUIRE(rdata->type == dns_rdatatype_afsdb);
81 REQUIRE(rdata->length != 0);
83 dns_name_init(&name, NULL);
84 dns_name_init(&prefix, NULL);
86 dns_rdata_toregion(rdata, ®ion);
87 num = uint16_fromregion(®ion);
88 isc_region_consume(®ion, 2);
89 sprintf(buf, "%u ", num);
90 RETERR(str_totext(buf, target));
91 dns_name_fromregion(&name, ®ion);
92 sub = name_prefix(&name, tctx->origin, &prefix);
93 return (dns_name_totext(&prefix, sub, target));
96 static inline isc_result_t
97 fromwire_afsdb(ARGS_FROMWIRE) {
102 REQUIRE(type == dns_rdatatype_afsdb);
107 dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
109 dns_name_init(&name, NULL);
111 isc_buffer_activeregion(source, &sr);
112 isc_buffer_availableregion(target, &tr);
114 return (ISC_R_NOSPACE);
116 return (ISC_R_UNEXPECTEDEND);
117 memmove(tr.base, sr.base, 2);
118 isc_buffer_forward(source, 2);
119 isc_buffer_add(target, 2);
120 return (dns_name_fromwire(&name, source, dctx, options, target));
123 static inline isc_result_t
124 towire_afsdb(ARGS_TOWIRE) {
128 dns_offsets_t offsets;
130 REQUIRE(rdata->type == dns_rdatatype_afsdb);
131 REQUIRE(rdata->length != 0);
133 dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
134 isc_buffer_availableregion(target, &tr);
135 dns_rdata_toregion(rdata, &sr);
137 return (ISC_R_NOSPACE);
138 memmove(tr.base, sr.base, 2);
139 isc_region_consume(&sr, 2);
140 isc_buffer_add(target, 2);
142 dns_name_init(&name, offsets);
143 dns_name_fromregion(&name, &sr);
145 return (dns_name_towire(&name, cctx, target));
149 compare_afsdb(ARGS_COMPARE) {
153 isc_region_t region1;
154 isc_region_t region2;
156 REQUIRE(rdata1->type == rdata2->type);
157 REQUIRE(rdata1->rdclass == rdata2->rdclass);
158 REQUIRE(rdata1->type == dns_rdatatype_afsdb);
159 REQUIRE(rdata1->length != 0);
160 REQUIRE(rdata2->length != 0);
162 result = memcmp(rdata1->data, rdata2->data, 2);
164 return (result < 0 ? -1 : 1);
166 dns_name_init(&name1, NULL);
167 dns_name_init(&name2, NULL);
169 dns_rdata_toregion(rdata1, ®ion1);
170 dns_rdata_toregion(rdata2, ®ion2);
172 isc_region_consume(®ion1, 2);
173 isc_region_consume(®ion2, 2);
175 dns_name_fromregion(&name1, ®ion1);
176 dns_name_fromregion(&name2, ®ion2);
178 return (dns_name_rdatacompare(&name1, &name2));
181 static inline isc_result_t
182 fromstruct_afsdb(ARGS_FROMSTRUCT) {
183 dns_rdata_afsdb_t *afsdb = source;
186 REQUIRE(type == dns_rdatatype_afsdb);
187 REQUIRE(source != NULL);
188 REQUIRE(afsdb->common.rdclass == rdclass);
189 REQUIRE(afsdb->common.rdtype == type);
194 RETERR(uint16_tobuffer(afsdb->subtype, target));
195 dns_name_toregion(&afsdb->server, ®ion);
196 return (isc_buffer_copyregion(target, ®ion));
199 static inline isc_result_t
200 tostruct_afsdb(ARGS_TOSTRUCT) {
202 dns_rdata_afsdb_t *afsdb = target;
205 REQUIRE(rdata->type == dns_rdatatype_afsdb);
206 REQUIRE(target != NULL);
207 REQUIRE(rdata->length != 0);
209 afsdb->common.rdclass = rdata->rdclass;
210 afsdb->common.rdtype = rdata->type;
211 ISC_LINK_INIT(&afsdb->common, link);
213 dns_name_init(&afsdb->server, NULL);
215 dns_rdata_toregion(rdata, ®ion);
217 afsdb->subtype = uint16_fromregion(®ion);
218 isc_region_consume(®ion, 2);
220 dns_name_init(&name, NULL);
221 dns_name_fromregion(&name, ®ion);
223 RETERR(name_duporclone(&name, mctx, &afsdb->server));
225 return (ISC_R_SUCCESS);
229 freestruct_afsdb(ARGS_FREESTRUCT) {
230 dns_rdata_afsdb_t *afsdb = source;
232 REQUIRE(source != NULL);
233 REQUIRE(afsdb->common.rdtype == dns_rdatatype_afsdb);
235 if (afsdb->mctx == NULL)
238 dns_name_free(&afsdb->server, afsdb->mctx);
242 static inline isc_result_t
243 additionaldata_afsdb(ARGS_ADDLDATA) {
245 dns_offsets_t offsets;
248 REQUIRE(rdata->type == dns_rdatatype_afsdb);
250 dns_name_init(&name, offsets);
251 dns_rdata_toregion(rdata, ®ion);
252 isc_region_consume(®ion, 2);
253 dns_name_fromregion(&name, ®ion);
255 return ((add)(arg, &name, dns_rdatatype_a));
258 static inline isc_result_t
259 digest_afsdb(ARGS_DIGEST) {
263 REQUIRE(rdata->type == dns_rdatatype_afsdb);
265 dns_rdata_toregion(rdata, &r1);
267 isc_region_consume(&r2, 2);
269 RETERR((digest)(arg, &r1));
270 dns_name_init(&name, NULL);
271 dns_name_fromregion(&name, &r2);
273 return (dns_name_digest(&name, digest, arg));
276 static inline isc_boolean_t
277 checkowner_afsdb(ARGS_CHECKOWNER) {
279 REQUIRE(type == dns_rdatatype_afsdb);
289 static inline isc_boolean_t
290 checknames_afsdb(ARGS_CHECKNAMES) {
294 REQUIRE(rdata->type == dns_rdatatype_afsdb);
298 dns_rdata_toregion(rdata, ®ion);
299 isc_region_consume(®ion, 2);
300 dns_name_init(&name, NULL);
301 dns_name_fromregion(&name, ®ion);
302 if (!dns_name_ishostname(&name, ISC_FALSE)) {
304 dns_name_clone(&name, bad);
311 casecompare_afsdb(ARGS_COMPARE) {
312 return (compare_afsdb(rdata1, rdata2));
314 #endif /* RDATA_GENERIC_AFSDB_18_C */