1135446Strhodes/*
2224092Sdougb * Copyright (C) 2004, 2007, 2009  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1998-2001  Internet Software Consortium.
4135446Strhodes *
5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18234010Sdougb/* $Id: ns_2.c,v 1.48 2009/12/04 22:06:37 tbox Exp $ */
19135446Strhodes
20135446Strhodes/* Reviewed: Wed Mar 15 18:15:00 PST 2000 by bwelling */
21135446Strhodes
22135446Strhodes#ifndef RDATA_GENERIC_NS_2_C
23135446Strhodes#define RDATA_GENERIC_NS_2_C
24135446Strhodes
25135446Strhodes#define RRTYPE_NS_ATTRIBUTES (DNS_RDATATYPEATTR_ZONECUTAUTH)
26135446Strhodes
27135446Strhodesstatic inline isc_result_t
28135446Strhodesfromtext_ns(ARGS_FROMTEXT) {
29135446Strhodes	isc_token_t token;
30135446Strhodes	dns_name_t name;
31135446Strhodes	isc_buffer_t buffer;
32135446Strhodes	isc_boolean_t ok;
33135446Strhodes
34135446Strhodes	REQUIRE(type == 2);
35135446Strhodes
36135446Strhodes	UNUSED(type);
37135446Strhodes	UNUSED(rdclass);
38135446Strhodes	UNUSED(callbacks);
39135446Strhodes
40135446Strhodes	RETERR(isc_lex_getmastertoken(lexer, &token,isc_tokentype_string,
41135446Strhodes				      ISC_FALSE));
42135446Strhodes
43135446Strhodes	dns_name_init(&name, NULL);
44135446Strhodes	buffer_fromregion(&buffer, &token.value.as_region);
45135446Strhodes	origin = (origin != NULL) ? origin : dns_rootname;
46135446Strhodes	RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target));
47135446Strhodes	ok = ISC_TRUE;
48135446Strhodes	if ((options & DNS_RDATA_CHECKNAMES) != 0)
49135446Strhodes		ok = dns_name_ishostname(&name, ISC_FALSE);
50135446Strhodes	if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0)
51135446Strhodes		RETTOK(DNS_R_BADNAME);
52135446Strhodes	if (!ok && callbacks != NULL)
53135446Strhodes		warn_badname(&name, lexer, callbacks);
54135446Strhodes	return (ISC_R_SUCCESS);
55135446Strhodes}
56135446Strhodes
57135446Strhodesstatic inline isc_result_t
58135446Strhodestotext_ns(ARGS_TOTEXT) {
59135446Strhodes	isc_region_t region;
60135446Strhodes	dns_name_t name;
61135446Strhodes	dns_name_t prefix;
62135446Strhodes	isc_boolean_t sub;
63135446Strhodes
64135446Strhodes	REQUIRE(rdata->type == 2);
65135446Strhodes	REQUIRE(rdata->length != 0);
66135446Strhodes
67135446Strhodes	dns_name_init(&name, NULL);
68135446Strhodes	dns_name_init(&prefix, NULL);
69135446Strhodes
70135446Strhodes	dns_rdata_toregion(rdata, &region);
71135446Strhodes	dns_name_fromregion(&name, &region);
72135446Strhodes
73135446Strhodes	sub = name_prefix(&name, tctx->origin, &prefix);
74135446Strhodes
75135446Strhodes	return (dns_name_totext(&prefix, sub, target));
76135446Strhodes}
77135446Strhodes
78135446Strhodesstatic inline isc_result_t
79135446Strhodesfromwire_ns(ARGS_FROMWIRE) {
80224092Sdougb	dns_name_t name;
81135446Strhodes
82135446Strhodes	REQUIRE(type == 2);
83135446Strhodes
84135446Strhodes	UNUSED(type);
85135446Strhodes	UNUSED(rdclass);
86135446Strhodes
87135446Strhodes	dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
88135446Strhodes
89224092Sdougb	dns_name_init(&name, NULL);
90224092Sdougb	return (dns_name_fromwire(&name, source, dctx, options, target));
91135446Strhodes}
92135446Strhodes
93135446Strhodesstatic inline isc_result_t
94135446Strhodestowire_ns(ARGS_TOWIRE) {
95135446Strhodes	dns_name_t name;
96135446Strhodes	dns_offsets_t offsets;
97135446Strhodes	isc_region_t region;
98135446Strhodes
99135446Strhodes	REQUIRE(rdata->type == 2);
100135446Strhodes	REQUIRE(rdata->length != 0);
101135446Strhodes
102135446Strhodes	dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
103135446Strhodes
104135446Strhodes	dns_name_init(&name, offsets);
105135446Strhodes	dns_rdata_toregion(rdata, &region);
106135446Strhodes	dns_name_fromregion(&name, &region);
107135446Strhodes
108135446Strhodes	return (dns_name_towire(&name, cctx, target));
109135446Strhodes}
110135446Strhodes
111135446Strhodesstatic inline int
112135446Strhodescompare_ns(ARGS_COMPARE) {
113135446Strhodes	dns_name_t name1;
114135446Strhodes	dns_name_t name2;
115135446Strhodes	isc_region_t region1;
116135446Strhodes	isc_region_t region2;
117135446Strhodes
118135446Strhodes	REQUIRE(rdata1->type == rdata2->type);
119135446Strhodes	REQUIRE(rdata1->rdclass == rdata2->rdclass);
120135446Strhodes	REQUIRE(rdata1->type == 2);
121135446Strhodes	REQUIRE(rdata1->length != 0);
122135446Strhodes	REQUIRE(rdata2->length != 0);
123135446Strhodes
124135446Strhodes	dns_name_init(&name1, NULL);
125135446Strhodes	dns_name_init(&name2, NULL);
126135446Strhodes
127135446Strhodes	dns_rdata_toregion(rdata1, &region1);
128135446Strhodes	dns_rdata_toregion(rdata2, &region2);
129135446Strhodes
130135446Strhodes	dns_name_fromregion(&name1, &region1);
131135446Strhodes	dns_name_fromregion(&name2, &region2);
132135446Strhodes
133135446Strhodes	return (dns_name_rdatacompare(&name1, &name2));
134135446Strhodes}
135135446Strhodes
136135446Strhodesstatic inline isc_result_t
137135446Strhodesfromstruct_ns(ARGS_FROMSTRUCT) {
138135446Strhodes	dns_rdata_ns_t *ns = source;
139135446Strhodes	isc_region_t region;
140135446Strhodes
141135446Strhodes	REQUIRE(type == 2);
142135446Strhodes	REQUIRE(source != NULL);
143135446Strhodes	REQUIRE(ns->common.rdtype == type);
144135446Strhodes	REQUIRE(ns->common.rdclass == rdclass);
145135446Strhodes
146135446Strhodes	UNUSED(type);
147135446Strhodes	UNUSED(rdclass);
148135446Strhodes
149135446Strhodes	dns_name_toregion(&ns->name, &region);
150135446Strhodes	return (isc_buffer_copyregion(target, &region));
151135446Strhodes}
152135446Strhodes
153135446Strhodesstatic inline isc_result_t
154135446Strhodestostruct_ns(ARGS_TOSTRUCT) {
155135446Strhodes	isc_region_t region;
156135446Strhodes	dns_rdata_ns_t *ns = target;
157135446Strhodes	dns_name_t name;
158135446Strhodes
159135446Strhodes	REQUIRE(rdata->type == 2);
160135446Strhodes	REQUIRE(target != NULL);
161135446Strhodes	REQUIRE(rdata->length != 0);
162135446Strhodes
163135446Strhodes	ns->common.rdclass = rdata->rdclass;
164135446Strhodes	ns->common.rdtype = rdata->type;
165135446Strhodes	ISC_LINK_INIT(&ns->common, link);
166135446Strhodes
167135446Strhodes	dns_name_init(&name, NULL);
168135446Strhodes	dns_rdata_toregion(rdata, &region);
169135446Strhodes	dns_name_fromregion(&name, &region);
170135446Strhodes	dns_name_init(&ns->name, NULL);
171135446Strhodes	RETERR(name_duporclone(&name, mctx, &ns->name));
172135446Strhodes	ns->mctx = mctx;
173135446Strhodes	return (ISC_R_SUCCESS);
174135446Strhodes}
175135446Strhodes
176135446Strhodesstatic inline void
177135446Strhodesfreestruct_ns(ARGS_FREESTRUCT) {
178135446Strhodes	dns_rdata_ns_t *ns = source;
179135446Strhodes
180135446Strhodes	REQUIRE(source != NULL);
181135446Strhodes
182135446Strhodes	if (ns->mctx == NULL)
183135446Strhodes		return;
184135446Strhodes
185135446Strhodes	dns_name_free(&ns->name, ns->mctx);
186135446Strhodes	ns->mctx = NULL;
187135446Strhodes}
188135446Strhodes
189135446Strhodesstatic inline isc_result_t
190135446Strhodesadditionaldata_ns(ARGS_ADDLDATA) {
191135446Strhodes	dns_name_t name;
192135446Strhodes	dns_offsets_t offsets;
193135446Strhodes	isc_region_t region;
194135446Strhodes
195135446Strhodes	REQUIRE(rdata->type == 2);
196135446Strhodes
197135446Strhodes	dns_name_init(&name, offsets);
198135446Strhodes	dns_rdata_toregion(rdata, &region);
199135446Strhodes	dns_name_fromregion(&name, &region);
200135446Strhodes
201135446Strhodes	return ((add)(arg, &name, dns_rdatatype_a));
202135446Strhodes}
203135446Strhodes
204135446Strhodesstatic inline isc_result_t
205135446Strhodesdigest_ns(ARGS_DIGEST) {
206135446Strhodes	isc_region_t r;
207135446Strhodes	dns_name_t name;
208135446Strhodes
209135446Strhodes	REQUIRE(rdata->type == 2);
210135446Strhodes
211135446Strhodes	dns_rdata_toregion(rdata, &r);
212135446Strhodes	dns_name_init(&name, NULL);
213135446Strhodes	dns_name_fromregion(&name, &r);
214135446Strhodes
215135446Strhodes	return (dns_name_digest(&name, digest, arg));
216135446Strhodes}
217135446Strhodes
218135446Strhodesstatic inline isc_boolean_t
219135446Strhodescheckowner_ns(ARGS_CHECKOWNER) {
220135446Strhodes
221135446Strhodes	REQUIRE(type == 2);
222135446Strhodes
223135446Strhodes	UNUSED(name);
224135446Strhodes	UNUSED(type);
225135446Strhodes	UNUSED(rdclass);
226135446Strhodes	UNUSED(wildcard);
227135446Strhodes
228135446Strhodes	return (ISC_TRUE);
229135446Strhodes}
230135446Strhodes
231135446Strhodesstatic inline isc_boolean_t
232135446Strhodeschecknames_ns(ARGS_CHECKNAMES) {
233135446Strhodes	isc_region_t region;
234135446Strhodes	dns_name_t name;
235135446Strhodes
236135446Strhodes	REQUIRE(rdata->type == 2);
237135446Strhodes
238135446Strhodes	UNUSED(owner);
239135446Strhodes
240135446Strhodes	dns_rdata_toregion(rdata, &region);
241135446Strhodes	dns_name_init(&name, NULL);
242135446Strhodes	dns_name_fromregion(&name, &region);
243135446Strhodes	if (!dns_name_ishostname(&name, ISC_FALSE)) {
244135446Strhodes		if (bad != NULL)
245135446Strhodes			dns_name_clone(&name, bad);
246135446Strhodes		return (ISC_FALSE);
247135446Strhodes	}
248135446Strhodes	return (ISC_TRUE);
249135446Strhodes}
250135446Strhodes
251224092Sdougbstatic inline int
252224092Sdougbcasecompare_ns(ARGS_COMPARE) {
253224092Sdougb	return (compare_ns(rdata1, rdata2));
254224092Sdougb}
255224092Sdougb
256135446Strhodes#endif	/* RDATA_GENERIC_NS_2_C */
257