1135446Strhodes/*
2254402Serwin * Copyright (C) 2004, 2005, 2007, 2009, 2013  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1999-2002  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: nsap_22.c,v 1.44 2009/12/04 22:06:37 tbox Exp $ */
19135446Strhodes
20135446Strhodes/* Reviewed: Fri Mar 17 10:41:07 PST 2000 by gson */
21135446Strhodes
22170222Sdougb/* RFC1706 */
23135446Strhodes
24135446Strhodes#ifndef RDATA_IN_1_NSAP_22_C
25135446Strhodes#define RDATA_IN_1_NSAP_22_C
26135446Strhodes
27135446Strhodes#define RRTYPE_NSAP_ATTRIBUTES (0)
28135446Strhodes
29135446Strhodesstatic inline isc_result_t
30135446Strhodesfromtext_in_nsap(ARGS_FROMTEXT) {
31135446Strhodes	isc_token_t token;
32135446Strhodes	isc_textregion_t *sr;
33135446Strhodes	int n;
34135446Strhodes	int digits;
35135446Strhodes	unsigned char c = 0;
36135446Strhodes
37135446Strhodes	REQUIRE(type == 22);
38135446Strhodes	REQUIRE(rdclass == 1);
39135446Strhodes
40135446Strhodes	UNUSED(type);
41135446Strhodes	UNUSED(origin);
42135446Strhodes	UNUSED(options);
43135446Strhodes	UNUSED(rdclass);
44135446Strhodes	UNUSED(callbacks);
45135446Strhodes
46135446Strhodes	/* 0x<hex.string.with.periods> */
47135446Strhodes	RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
48135446Strhodes				      ISC_FALSE));
49135446Strhodes	sr = &token.value.as_textregion;
50135446Strhodes	if (sr->length < 2)
51135446Strhodes		RETTOK(ISC_R_UNEXPECTEDEND);
52135446Strhodes	if (sr->base[0] != '0' || (sr->base[1] != 'x' && sr->base[1] != 'X'))
53135446Strhodes		RETTOK(DNS_R_SYNTAX);
54135446Strhodes	isc_textregion_consume(sr, 2);
55135446Strhodes	digits = 0;
56135446Strhodes	while (sr->length > 0) {
57135446Strhodes		if (sr->base[0] == '.') {
58135446Strhodes			isc_textregion_consume(sr, 1);
59135446Strhodes			continue;
60135446Strhodes		}
61135446Strhodes		if ((n = hexvalue(sr->base[0])) == -1)
62135446Strhodes			RETTOK(DNS_R_SYNTAX);
63135446Strhodes		c <<= 4;
64135446Strhodes		c += n;
65135446Strhodes		if (++digits == 2) {
66135446Strhodes			RETERR(mem_tobuffer(target, &c, 1));
67135446Strhodes			digits = 0;
68135446Strhodes		}
69135446Strhodes		isc_textregion_consume(sr, 1);
70135446Strhodes	}
71135446Strhodes	if (digits)
72135446Strhodes		RETTOK(ISC_R_UNEXPECTEDEND);
73135446Strhodes	return (ISC_R_SUCCESS);
74135446Strhodes}
75135446Strhodes
76135446Strhodesstatic inline isc_result_t
77135446Strhodestotext_in_nsap(ARGS_TOTEXT) {
78135446Strhodes	isc_region_t region;
79135446Strhodes	char buf[sizeof("xx")];
80135446Strhodes
81135446Strhodes	REQUIRE(rdata->type == 22);
82135446Strhodes	REQUIRE(rdata->rdclass == 1);
83135446Strhodes	REQUIRE(rdata->length != 0);
84135446Strhodes
85135446Strhodes	UNUSED(tctx);
86135446Strhodes
87135446Strhodes	dns_rdata_toregion(rdata, &region);
88135446Strhodes	RETERR(str_totext("0x", target));
89135446Strhodes	while (region.length != 0) {
90135446Strhodes		sprintf(buf, "%02x", region.base[0]);
91135446Strhodes		isc_region_consume(&region, 1);
92135446Strhodes		RETERR(str_totext(buf, target));
93135446Strhodes	}
94135446Strhodes	return (ISC_R_SUCCESS);
95135446Strhodes}
96135446Strhodes
97135446Strhodesstatic inline isc_result_t
98135446Strhodesfromwire_in_nsap(ARGS_FROMWIRE) {
99135446Strhodes	isc_region_t region;
100135446Strhodes
101135446Strhodes	REQUIRE(type == 22);
102135446Strhodes	REQUIRE(rdclass == 1);
103135446Strhodes
104135446Strhodes	UNUSED(type);
105135446Strhodes	UNUSED(dctx);
106135446Strhodes	UNUSED(options);
107135446Strhodes	UNUSED(rdclass);
108135446Strhodes
109135446Strhodes	isc_buffer_activeregion(source, &region);
110135446Strhodes	if (region.length < 1)
111135446Strhodes		return (ISC_R_UNEXPECTEDEND);
112135446Strhodes
113135446Strhodes	RETERR(mem_tobuffer(target, region.base, region.length));
114135446Strhodes	isc_buffer_forward(source, region.length);
115135446Strhodes	return (ISC_R_SUCCESS);
116135446Strhodes}
117135446Strhodes
118135446Strhodesstatic inline isc_result_t
119135446Strhodestowire_in_nsap(ARGS_TOWIRE) {
120135446Strhodes	REQUIRE(rdata->type == 22);
121135446Strhodes	REQUIRE(rdata->rdclass == 1);
122135446Strhodes	REQUIRE(rdata->length != 0);
123135446Strhodes
124135446Strhodes	UNUSED(cctx);
125135446Strhodes
126135446Strhodes	return (mem_tobuffer(target, rdata->data, rdata->length));
127135446Strhodes}
128135446Strhodes
129135446Strhodesstatic inline int
130135446Strhodescompare_in_nsap(ARGS_COMPARE) {
131135446Strhodes	isc_region_t r1;
132135446Strhodes	isc_region_t r2;
133135446Strhodes
134135446Strhodes	REQUIRE(rdata1->type == rdata2->type);
135135446Strhodes	REQUIRE(rdata1->rdclass == rdata2->rdclass);
136135446Strhodes	REQUIRE(rdata1->type == 22);
137135446Strhodes	REQUIRE(rdata1->rdclass == 1);
138135446Strhodes	REQUIRE(rdata1->length != 0);
139135446Strhodes	REQUIRE(rdata2->length != 0);
140135446Strhodes
141135446Strhodes	dns_rdata_toregion(rdata1, &r1);
142135446Strhodes	dns_rdata_toregion(rdata2, &r2);
143135446Strhodes	return (isc_region_compare(&r1, &r2));
144135446Strhodes}
145135446Strhodes
146135446Strhodesstatic inline isc_result_t
147135446Strhodesfromstruct_in_nsap(ARGS_FROMSTRUCT) {
148135446Strhodes	dns_rdata_in_nsap_t *nsap = source;
149135446Strhodes
150135446Strhodes	REQUIRE(type == 22);
151135446Strhodes	REQUIRE(rdclass == 1);
152135446Strhodes	REQUIRE(source != NULL);
153135446Strhodes	REQUIRE(nsap->common.rdtype == type);
154135446Strhodes	REQUIRE(nsap->common.rdclass == rdclass);
155135446Strhodes	REQUIRE(nsap->nsap != NULL || nsap->nsap_len == 0);
156135446Strhodes
157135446Strhodes	UNUSED(type);
158135446Strhodes	UNUSED(rdclass);
159135446Strhodes
160135446Strhodes	return (mem_tobuffer(target, nsap->nsap, nsap->nsap_len));
161135446Strhodes}
162135446Strhodes
163135446Strhodesstatic inline isc_result_t
164135446Strhodestostruct_in_nsap(ARGS_TOSTRUCT) {
165135446Strhodes	dns_rdata_in_nsap_t *nsap = target;
166135446Strhodes	isc_region_t r;
167135446Strhodes
168135446Strhodes	REQUIRE(rdata->type == 22);
169135446Strhodes	REQUIRE(rdata->rdclass == 1);
170135446Strhodes	REQUIRE(target != NULL);
171135446Strhodes	REQUIRE(rdata->length != 0);
172135446Strhodes
173135446Strhodes	nsap->common.rdclass = rdata->rdclass;
174135446Strhodes	nsap->common.rdtype = rdata->type;
175135446Strhodes	ISC_LINK_INIT(&nsap->common, link);
176135446Strhodes
177135446Strhodes	dns_rdata_toregion(rdata, &r);
178135446Strhodes	nsap->nsap_len = r.length;
179135446Strhodes	nsap->nsap = mem_maybedup(mctx, r.base, r.length);
180135446Strhodes	if (nsap->nsap == NULL)
181135446Strhodes		return (ISC_R_NOMEMORY);
182135446Strhodes
183135446Strhodes	nsap->mctx = mctx;
184135446Strhodes	return (ISC_R_SUCCESS);
185135446Strhodes}
186135446Strhodes
187135446Strhodesstatic inline void
188135446Strhodesfreestruct_in_nsap(ARGS_FREESTRUCT) {
189135446Strhodes	dns_rdata_in_nsap_t *nsap = source;
190135446Strhodes
191135446Strhodes	REQUIRE(source != NULL);
192135446Strhodes	REQUIRE(nsap->common.rdclass == 1);
193135446Strhodes	REQUIRE(nsap->common.rdtype == 22);
194135446Strhodes
195135446Strhodes	if (nsap->mctx == NULL)
196135446Strhodes		return;
197135446Strhodes
198135446Strhodes	if (nsap->nsap != NULL)
199135446Strhodes		isc_mem_free(nsap->mctx, nsap->nsap);
200135446Strhodes	nsap->mctx = NULL;
201135446Strhodes}
202135446Strhodes
203135446Strhodesstatic inline isc_result_t
204135446Strhodesadditionaldata_in_nsap(ARGS_ADDLDATA) {
205135446Strhodes	REQUIRE(rdata->type == 22);
206135446Strhodes	REQUIRE(rdata->rdclass == 1);
207135446Strhodes
208135446Strhodes	UNUSED(rdata);
209135446Strhodes	UNUSED(add);
210135446Strhodes	UNUSED(arg);
211135446Strhodes
212135446Strhodes	return (ISC_R_SUCCESS);
213135446Strhodes}
214135446Strhodes
215135446Strhodesstatic inline isc_result_t
216135446Strhodesdigest_in_nsap(ARGS_DIGEST) {
217135446Strhodes	isc_region_t r;
218135446Strhodes
219135446Strhodes	REQUIRE(rdata->type == 22);
220135446Strhodes	REQUIRE(rdata->rdclass == 1);
221135446Strhodes
222135446Strhodes	dns_rdata_toregion(rdata, &r);
223135446Strhodes
224135446Strhodes	return ((digest)(arg, &r));
225135446Strhodes}
226135446Strhodes
227135446Strhodesstatic inline isc_boolean_t
228135446Strhodescheckowner_in_nsap(ARGS_CHECKOWNER) {
229135446Strhodes
230135446Strhodes	REQUIRE(type == 22);
231135446Strhodes	REQUIRE(rdclass == 1);
232135446Strhodes
233135446Strhodes	UNUSED(name);
234135446Strhodes	UNUSED(type);
235135446Strhodes	UNUSED(rdclass);
236135446Strhodes	UNUSED(wildcard);
237135446Strhodes
238135446Strhodes	return (ISC_TRUE);
239135446Strhodes}
240135446Strhodes
241135446Strhodesstatic inline isc_boolean_t
242135446Strhodeschecknames_in_nsap(ARGS_CHECKNAMES) {
243135446Strhodes
244135446Strhodes	REQUIRE(rdata->type == 22);
245135446Strhodes	REQUIRE(rdata->rdclass == 1);
246135446Strhodes
247135446Strhodes	UNUSED(rdata);
248135446Strhodes	UNUSED(owner);
249135446Strhodes	UNUSED(bad);
250135446Strhodes
251135446Strhodes	return (ISC_TRUE);
252135446Strhodes}
253135446Strhodes
254224092Sdougbstatic inline int
255224092Sdougbcasecompare_in_nsap(ARGS_COMPARE) {
256224092Sdougb	return (compare_in_nsap(rdata1, rdata2));
257224092Sdougb}
258224092Sdougb
259135446Strhodes#endif	/* RDATA_IN_1_NSAP_22_C */
260