1135446Strhodes/*
2224092Sdougb * Copyright (C) 2004, 2005, 2007, 2009  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1999-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: rp_17.c,v 1.44 2009/12/04 22:06:37 tbox Exp $ */
19135446Strhodes
20170222Sdougb/* RFC1183 */
21135446Strhodes
22135446Strhodes#ifndef RDATA_GENERIC_RP_17_C
23135446Strhodes#define RDATA_GENERIC_RP_17_C
24135446Strhodes
25135446Strhodes#define RRTYPE_RP_ATTRIBUTES (0)
26135446Strhodes
27135446Strhodesstatic inline isc_result_t
28135446Strhodesfromtext_rp(ARGS_FROMTEXT) {
29135446Strhodes	isc_token_t token;
30135446Strhodes	dns_name_t name;
31135446Strhodes	isc_buffer_t buffer;
32135446Strhodes	int i;
33135446Strhodes	isc_boolean_t ok;
34135446Strhodes
35135446Strhodes	REQUIRE(type == 17);
36135446Strhodes
37135446Strhodes	UNUSED(type);
38135446Strhodes	UNUSED(rdclass);
39135446Strhodes	UNUSED(callbacks);
40135446Strhodes
41135446Strhodes	origin = (origin != NULL) ? origin : dns_rootname;
42135446Strhodes
43135446Strhodes	for (i = 0; i < 2; i++) {
44135446Strhodes		RETERR(isc_lex_getmastertoken(lexer, &token,
45135446Strhodes					      isc_tokentype_string,
46135446Strhodes					      ISC_FALSE));
47135446Strhodes		dns_name_init(&name, NULL);
48135446Strhodes		buffer_fromregion(&buffer, &token.value.as_region);
49135446Strhodes		RETTOK(dns_name_fromtext(&name, &buffer, origin,
50135446Strhodes					 options, target));
51135446Strhodes		ok = ISC_TRUE;
52135446Strhodes		if ((options & DNS_RDATA_CHECKNAMES) != 0 && i == 0)
53135446Strhodes			ok = dns_name_ismailbox(&name);
54135446Strhodes		if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0)
55135446Strhodes			RETTOK(DNS_R_BADNAME);
56135446Strhodes		if (!ok && callbacks != NULL)
57135446Strhodes			warn_badname(&name, lexer, callbacks);
58135446Strhodes	}
59135446Strhodes	return (ISC_R_SUCCESS);
60135446Strhodes}
61135446Strhodes
62135446Strhodesstatic inline isc_result_t
63135446Strhodestotext_rp(ARGS_TOTEXT) {
64135446Strhodes	isc_region_t region;
65135446Strhodes	dns_name_t rmail;
66135446Strhodes	dns_name_t email;
67135446Strhodes	dns_name_t prefix;
68135446Strhodes	isc_boolean_t sub;
69135446Strhodes
70135446Strhodes	REQUIRE(rdata->type == 17);
71135446Strhodes	REQUIRE(rdata->length != 0);
72135446Strhodes
73135446Strhodes	dns_name_init(&rmail, NULL);
74135446Strhodes	dns_name_init(&email, NULL);
75135446Strhodes	dns_name_init(&prefix, NULL);
76135446Strhodes
77135446Strhodes	dns_rdata_toregion(rdata, &region);
78135446Strhodes
79135446Strhodes	dns_name_fromregion(&rmail, &region);
80135446Strhodes	isc_region_consume(&region, rmail.length);
81135446Strhodes
82135446Strhodes	dns_name_fromregion(&email, &region);
83135446Strhodes	isc_region_consume(&region, email.length);
84135446Strhodes
85135446Strhodes	sub = name_prefix(&rmail, tctx->origin, &prefix);
86135446Strhodes	RETERR(dns_name_totext(&prefix, sub, target));
87135446Strhodes
88135446Strhodes	RETERR(str_totext(" ", target));
89135446Strhodes
90135446Strhodes	sub = name_prefix(&email, tctx->origin, &prefix);
91135446Strhodes	return (dns_name_totext(&prefix, sub, target));
92135446Strhodes}
93135446Strhodes
94135446Strhodesstatic inline isc_result_t
95135446Strhodesfromwire_rp(ARGS_FROMWIRE) {
96224092Sdougb	dns_name_t rmail;
97224092Sdougb	dns_name_t email;
98135446Strhodes
99135446Strhodes	REQUIRE(type == 17);
100135446Strhodes
101135446Strhodes	UNUSED(type);
102135446Strhodes	UNUSED(rdclass);
103135446Strhodes
104135446Strhodes	dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
105135446Strhodes
106224092Sdougb	dns_name_init(&rmail, NULL);
107224092Sdougb	dns_name_init(&email, NULL);
108135446Strhodes
109224092Sdougb	RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
110224092Sdougb	return (dns_name_fromwire(&email, source, dctx, options, target));
111135446Strhodes}
112135446Strhodes
113135446Strhodesstatic inline isc_result_t
114135446Strhodestowire_rp(ARGS_TOWIRE) {
115135446Strhodes	isc_region_t region;
116135446Strhodes	dns_name_t rmail;
117135446Strhodes	dns_name_t email;
118135446Strhodes	dns_offsets_t roffsets;
119135446Strhodes	dns_offsets_t eoffsets;
120135446Strhodes
121135446Strhodes	REQUIRE(rdata->type == 17);
122135446Strhodes	REQUIRE(rdata->length != 0);
123135446Strhodes
124135446Strhodes	dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
125135446Strhodes	dns_name_init(&rmail, roffsets);
126135446Strhodes	dns_name_init(&email, eoffsets);
127135446Strhodes
128135446Strhodes	dns_rdata_toregion(rdata, &region);
129135446Strhodes
130135446Strhodes	dns_name_fromregion(&rmail, &region);
131135446Strhodes	isc_region_consume(&region, rmail.length);
132135446Strhodes
133135446Strhodes	RETERR(dns_name_towire(&rmail, cctx, target));
134135446Strhodes
135135446Strhodes	dns_name_fromregion(&rmail, &region);
136135446Strhodes	isc_region_consume(&region, rmail.length);
137135446Strhodes
138135446Strhodes	return (dns_name_towire(&rmail, cctx, target));
139135446Strhodes}
140135446Strhodes
141135446Strhodesstatic inline int
142135446Strhodescompare_rp(ARGS_COMPARE) {
143135446Strhodes	isc_region_t region1;
144135446Strhodes	isc_region_t region2;
145135446Strhodes	dns_name_t name1;
146135446Strhodes	dns_name_t name2;
147135446Strhodes	int order;
148135446Strhodes
149135446Strhodes	REQUIRE(rdata1->type == rdata2->type);
150135446Strhodes	REQUIRE(rdata1->rdclass == rdata2->rdclass);
151135446Strhodes	REQUIRE(rdata1->type == 17);
152135446Strhodes	REQUIRE(rdata1->length != 0);
153135446Strhodes	REQUIRE(rdata2->length != 0);
154135446Strhodes
155135446Strhodes	dns_name_init(&name1, NULL);
156135446Strhodes	dns_name_init(&name2, NULL);
157135446Strhodes
158135446Strhodes	dns_rdata_toregion(rdata1, &region1);
159135446Strhodes	dns_rdata_toregion(rdata2, &region2);
160135446Strhodes
161135446Strhodes	dns_name_fromregion(&name1, &region1);
162135446Strhodes	dns_name_fromregion(&name2, &region2);
163135446Strhodes
164135446Strhodes	order = dns_name_rdatacompare(&name1, &name2);
165135446Strhodes	if (order != 0)
166135446Strhodes		return (order);
167135446Strhodes
168135446Strhodes	isc_region_consume(&region1, name_length(&name1));
169135446Strhodes	isc_region_consume(&region2, name_length(&name2));
170135446Strhodes
171135446Strhodes	dns_name_init(&name1, NULL);
172135446Strhodes	dns_name_init(&name2, NULL);
173135446Strhodes
174135446Strhodes	dns_name_fromregion(&name1, &region1);
175135446Strhodes	dns_name_fromregion(&name2, &region2);
176135446Strhodes
177135446Strhodes	return (dns_name_rdatacompare(&name1, &name2));
178135446Strhodes}
179135446Strhodes
180135446Strhodesstatic inline isc_result_t
181135446Strhodesfromstruct_rp(ARGS_FROMSTRUCT) {
182135446Strhodes	dns_rdata_rp_t *rp = source;
183135446Strhodes	isc_region_t region;
184135446Strhodes
185135446Strhodes	REQUIRE(type == 17);
186135446Strhodes	REQUIRE(source != NULL);
187135446Strhodes	REQUIRE(rp->common.rdtype == type);
188135446Strhodes	REQUIRE(rp->common.rdclass == rdclass);
189135446Strhodes
190135446Strhodes	UNUSED(type);
191135446Strhodes	UNUSED(rdclass);
192135446Strhodes
193135446Strhodes	dns_name_toregion(&rp->mail, &region);
194135446Strhodes	RETERR(isc_buffer_copyregion(target, &region));
195135446Strhodes	dns_name_toregion(&rp->text, &region);
196135446Strhodes	return (isc_buffer_copyregion(target, &region));
197135446Strhodes}
198135446Strhodes
199135446Strhodesstatic inline isc_result_t
200135446Strhodestostruct_rp(ARGS_TOSTRUCT) {
201135446Strhodes	isc_result_t result;
202135446Strhodes	isc_region_t region;
203135446Strhodes	dns_rdata_rp_t *rp = target;
204135446Strhodes	dns_name_t name;
205135446Strhodes
206135446Strhodes	REQUIRE(rdata->type == 17);
207135446Strhodes	REQUIRE(target != NULL);
208135446Strhodes	REQUIRE(rdata->length != 0);
209135446Strhodes
210135446Strhodes	rp->common.rdclass = rdata->rdclass;
211135446Strhodes	rp->common.rdtype = rdata->type;
212135446Strhodes	ISC_LINK_INIT(&rp->common, link);
213135446Strhodes
214135446Strhodes	dns_name_init(&name, NULL);
215135446Strhodes	dns_rdata_toregion(rdata, &region);
216135446Strhodes	dns_name_fromregion(&name, &region);
217135446Strhodes	dns_name_init(&rp->mail, NULL);
218135446Strhodes	RETERR(name_duporclone(&name, mctx, &rp->mail));
219135446Strhodes	isc_region_consume(&region, name_length(&name));
220135446Strhodes	dns_name_fromregion(&name, &region);
221135446Strhodes	dns_name_init(&rp->text, NULL);
222135446Strhodes	result = name_duporclone(&name, mctx, &rp->text);
223135446Strhodes	if (result != ISC_R_SUCCESS)
224135446Strhodes		goto cleanup;
225135446Strhodes
226135446Strhodes	rp->mctx = mctx;
227135446Strhodes	return (ISC_R_SUCCESS);
228135446Strhodes
229135446Strhodes cleanup:
230135446Strhodes	if (mctx != NULL)
231135446Strhodes		dns_name_free(&rp->mail, mctx);
232135446Strhodes	return (ISC_R_NOMEMORY);
233135446Strhodes}
234135446Strhodes
235135446Strhodesstatic inline void
236135446Strhodesfreestruct_rp(ARGS_FREESTRUCT) {
237135446Strhodes	dns_rdata_rp_t *rp = source;
238135446Strhodes
239135446Strhodes	REQUIRE(source != NULL);
240135446Strhodes	REQUIRE(rp->common.rdtype == 17);
241135446Strhodes
242135446Strhodes	if (rp->mctx == NULL)
243135446Strhodes		return;
244135446Strhodes
245135446Strhodes	dns_name_free(&rp->mail, rp->mctx);
246135446Strhodes	dns_name_free(&rp->text, rp->mctx);
247135446Strhodes	rp->mctx = NULL;
248135446Strhodes}
249135446Strhodes
250135446Strhodesstatic inline isc_result_t
251135446Strhodesadditionaldata_rp(ARGS_ADDLDATA) {
252135446Strhodes	REQUIRE(rdata->type == 17);
253135446Strhodes
254135446Strhodes	UNUSED(rdata);
255135446Strhodes	UNUSED(add);
256135446Strhodes	UNUSED(arg);
257135446Strhodes
258135446Strhodes	return (ISC_R_SUCCESS);
259135446Strhodes}
260135446Strhodes
261135446Strhodesstatic inline isc_result_t
262135446Strhodesdigest_rp(ARGS_DIGEST) {
263135446Strhodes	isc_region_t r;
264135446Strhodes	dns_name_t name;
265135446Strhodes
266135446Strhodes	REQUIRE(rdata->type == 17);
267135446Strhodes
268135446Strhodes	dns_rdata_toregion(rdata, &r);
269135446Strhodes	dns_name_init(&name, NULL);
270135446Strhodes
271135446Strhodes	dns_name_fromregion(&name, &r);
272135446Strhodes	RETERR(dns_name_digest(&name, digest, arg));
273135446Strhodes	isc_region_consume(&r, name_length(&name));
274135446Strhodes
275135446Strhodes	dns_name_init(&name, NULL);
276135446Strhodes	dns_name_fromregion(&name, &r);
277135446Strhodes
278135446Strhodes	return (dns_name_digest(&name, digest, arg));
279135446Strhodes}
280135446Strhodes
281135446Strhodesstatic inline isc_boolean_t
282135446Strhodescheckowner_rp(ARGS_CHECKOWNER) {
283135446Strhodes
284135446Strhodes	REQUIRE(type == 17);
285135446Strhodes
286135446Strhodes	UNUSED(name);
287135446Strhodes	UNUSED(type);
288135446Strhodes	UNUSED(rdclass);
289135446Strhodes	UNUSED(wildcard);
290135446Strhodes
291135446Strhodes	return (ISC_TRUE);
292135446Strhodes}
293135446Strhodes
294135446Strhodesstatic inline isc_boolean_t
295135446Strhodeschecknames_rp(ARGS_CHECKNAMES) {
296135446Strhodes	isc_region_t region;
297135446Strhodes	dns_name_t name;
298135446Strhodes
299135446Strhodes	REQUIRE(rdata->type == 17);
300135446Strhodes
301135446Strhodes	UNUSED(owner);
302135446Strhodes
303135446Strhodes	dns_rdata_toregion(rdata, &region);
304135446Strhodes	dns_name_init(&name, NULL);
305135446Strhodes	dns_name_fromregion(&name, &region);
306135446Strhodes	if (!dns_name_ismailbox(&name)) {
307135446Strhodes		if (bad != NULL)
308135446Strhodes				dns_name_clone(&name, bad);
309135446Strhodes		return (ISC_FALSE);
310135446Strhodes	}
311135446Strhodes	return (ISC_TRUE);
312135446Strhodes}
313135446Strhodes
314224092Sdougbstatic inline int
315224092Sdougbcasecompare_rp(ARGS_COMPARE) {
316224092Sdougb	return (compare_rp(rdata1, rdata2));
317224092Sdougb}
318135446Strhodes#endif	/* RDATA_GENERIC_RP_17_C */
319