1 /*
2  * Copyright (C) 2015  Internet Systems Consortium, Inc. ("ISC")
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14  * PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef RDATA_GENERIC_TALINK_58_C
18 #define RDATA_GENERIC_TALINK_58_C
19 
20 #define RRTYPE_TALINK_ATTRIBUTES 0
21 
22 static inline isc_result_t
fromtext_talink(ARGS_FROMTEXT)23 fromtext_talink(ARGS_FROMTEXT) {
24 	isc_token_t token;
25 	dns_name_t name;
26 	isc_buffer_t buffer;
27 	int i;
28 
29 	REQUIRE(type == dns_rdatatype_talink);
30 
31 	UNUSED(type);
32 	UNUSED(rdclass);
33 	UNUSED(callbacks);
34 
35 	if (origin == NULL)
36 		origin = dns_rootname;
37 
38 	for (i = 0; i < 2; i++) {
39 		RETERR(isc_lex_getmastertoken(lexer, &token,
40 					      isc_tokentype_string,
41 					      ISC_FALSE));
42 
43 		dns_name_init(&name, NULL);
44 		buffer_fromregion(&buffer, &token.value.as_region);
45 		RETTOK(dns_name_fromtext(&name, &buffer, origin,
46 					 options, target));
47 	}
48 
49 	return (ISC_R_SUCCESS);
50 }
51 
52 static inline isc_result_t
totext_talink(ARGS_TOTEXT)53 totext_talink(ARGS_TOTEXT) {
54 	isc_region_t dregion;
55 	dns_name_t prev;
56 	dns_name_t next;
57 	dns_name_t prefix;
58 	isc_boolean_t sub;
59 
60 	REQUIRE(rdata->type == dns_rdatatype_talink);
61 	REQUIRE(rdata->length != 0);
62 
63 	dns_name_init(&prev, NULL);
64 	dns_name_init(&next, NULL);
65 	dns_name_init(&prefix, NULL);
66 
67 	dns_rdata_toregion(rdata, &dregion);
68 
69 	dns_name_fromregion(&prev, &dregion);
70 	isc_region_consume(&dregion, name_length(&prev));
71 
72 	dns_name_fromregion(&next, &dregion);
73 	isc_region_consume(&dregion, name_length(&next));
74 
75 	sub = name_prefix(&prev, tctx->origin, &prefix);
76 	RETERR(dns_name_totext(&prefix, sub, target));
77 
78 	RETERR(str_totext(" ", target));
79 
80 	sub = name_prefix(&next, tctx->origin, &prefix);
81 	return(dns_name_totext(&prefix, sub, target));
82 }
83 
84 static inline isc_result_t
fromwire_talink(ARGS_FROMWIRE)85 fromwire_talink(ARGS_FROMWIRE) {
86 	dns_name_t prev;
87 	dns_name_t next;
88 
89 	REQUIRE(type == dns_rdatatype_talink);
90 
91 	UNUSED(type);
92 	UNUSED(rdclass);
93 
94 	dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
95 
96 	dns_name_init(&prev, NULL);
97 	dns_name_init(&next, NULL);
98 
99 	RETERR(dns_name_fromwire(&prev, source, dctx, options, target));
100 	return(dns_name_fromwire(&next, source, dctx, options, target));
101 }
102 
103 static inline isc_result_t
towire_talink(ARGS_TOWIRE)104 towire_talink(ARGS_TOWIRE) {
105 	isc_region_t sregion;
106 	dns_name_t prev;
107 	dns_name_t next;
108 	dns_offsets_t moffsets;
109 	dns_offsets_t roffsets;
110 
111 	REQUIRE(rdata->type == dns_rdatatype_talink);
112 	REQUIRE(rdata->length != 0);
113 
114 	dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
115 
116 	dns_name_init(&prev, moffsets);
117 	dns_name_init(&next, roffsets);
118 
119 	dns_rdata_toregion(rdata, &sregion);
120 
121 	dns_name_fromregion(&prev, &sregion);
122 	isc_region_consume(&sregion, name_length(&prev));
123 	RETERR(dns_name_towire(&prev, cctx, target));
124 
125 	dns_name_fromregion(&next, &sregion);
126 	isc_region_consume(&sregion, name_length(&next));
127 	return(dns_name_towire(&next, cctx, target));
128 }
129 
130 static inline int
compare_talink(ARGS_COMPARE)131 compare_talink(ARGS_COMPARE) {
132 	isc_region_t region1;
133 	isc_region_t region2;
134 
135 	REQUIRE(rdata1->type == rdata2->type);
136 	REQUIRE(rdata1->rdclass == rdata2->rdclass);
137 	REQUIRE(rdata1->type == dns_rdatatype_talink);
138 	REQUIRE(rdata1->length != 0);
139 	REQUIRE(rdata2->length != 0);
140 
141 	dns_rdata_toregion(rdata1, &region1);
142 	dns_rdata_toregion(rdata2, &region2);
143 	return (isc_region_compare(&region1, &region2));
144 }
145 
146 static inline isc_result_t
fromstruct_talink(ARGS_FROMSTRUCT)147 fromstruct_talink(ARGS_FROMSTRUCT) {
148 	dns_rdata_talink_t *talink = source;
149 	isc_region_t region;
150 
151 	REQUIRE(type == dns_rdatatype_talink);
152 	REQUIRE(source != NULL);
153 	REQUIRE(talink->common.rdtype == type);
154 	REQUIRE(talink->common.rdclass == rdclass);
155 
156 	UNUSED(type);
157 	UNUSED(rdclass);
158 
159 	dns_name_toregion(&talink->prev, &region);
160 	RETERR(isc_buffer_copyregion(target, &region));
161 	dns_name_toregion(&talink->next, &region);
162 	return(isc_buffer_copyregion(target, &region));
163 }
164 
165 static inline isc_result_t
tostruct_talink(ARGS_TOSTRUCT)166 tostruct_talink(ARGS_TOSTRUCT) {
167 	isc_region_t region;
168 	dns_rdata_talink_t *talink = target;
169 	dns_name_t name;
170 	isc_result_t result;
171 
172 	REQUIRE(rdata->type == dns_rdatatype_talink);
173 	REQUIRE(target != NULL);
174 	REQUIRE(rdata->length != 0);
175 
176 	talink->common.rdclass = rdata->rdclass;
177 	talink->common.rdtype = rdata->type;
178 	ISC_LINK_INIT(&talink->common, link);
179 
180 	dns_rdata_toregion(rdata, &region);
181 
182 	dns_name_init(&name, NULL);
183 	dns_name_fromregion(&name, &region);
184 	isc_region_consume(&region, name_length(&name));
185 	dns_name_init(&talink->prev, NULL);
186 	RETERR(name_duporclone(&name, mctx, &talink->prev));
187 
188 	dns_name_fromregion(&name, &region);
189 	isc_region_consume(&region, name_length(&name));
190 	dns_name_init(&talink->next, NULL);
191 	result = name_duporclone(&name, mctx, &talink->next);
192 	if (result != ISC_R_SUCCESS)
193 		goto cleanup;
194 
195 	talink->mctx = mctx;
196 	return (ISC_R_SUCCESS);
197 
198  cleanup:
199 	if (mctx != NULL)
200 		dns_name_free(&talink->prev, mctx);
201 	return (ISC_R_NOMEMORY);
202 }
203 
204 static inline void
freestruct_talink(ARGS_FREESTRUCT)205 freestruct_talink(ARGS_FREESTRUCT) {
206 	dns_rdata_talink_t *talink = source;
207 
208 	REQUIRE(source != NULL);
209 	REQUIRE(talink->common.rdtype == dns_rdatatype_talink);
210 
211 	if (talink->mctx == NULL)
212 		return;
213 
214 	dns_name_free(&talink->prev, talink->mctx);
215 	dns_name_free(&talink->next, talink->mctx);
216 	talink->mctx = NULL;
217 }
218 
219 static inline isc_result_t
additionaldata_talink(ARGS_ADDLDATA)220 additionaldata_talink(ARGS_ADDLDATA) {
221 	UNUSED(rdata);
222 	UNUSED(add);
223 	UNUSED(arg);
224 
225 	REQUIRE(rdata->type == dns_rdatatype_talink);
226 
227 	return (ISC_R_SUCCESS);
228 }
229 
230 static inline isc_result_t
digest_talink(ARGS_DIGEST)231 digest_talink(ARGS_DIGEST) {
232 	isc_region_t r;
233 
234 	REQUIRE(rdata->type == dns_rdatatype_talink);
235 
236 	dns_rdata_toregion(rdata, &r);
237 	return ((digest)(arg, &r));
238 }
239 
240 static inline isc_boolean_t
checkowner_talink(ARGS_CHECKOWNER)241 checkowner_talink(ARGS_CHECKOWNER) {
242 
243 	REQUIRE(type == dns_rdatatype_talink);
244 
245 	UNUSED(name);
246 	UNUSED(type);
247 	UNUSED(rdclass);
248 	UNUSED(wildcard);
249 
250 	return (ISC_TRUE);
251 }
252 
253 static inline isc_boolean_t
checknames_talink(ARGS_CHECKNAMES)254 checknames_talink(ARGS_CHECKNAMES) {
255 
256 	REQUIRE(rdata->type == dns_rdatatype_talink);
257 
258 	UNUSED(bad);
259 	UNUSED(owner);
260 
261 	return (ISC_TRUE);
262 }
263 
264 static inline int
casecompare_talink(ARGS_COMPARE)265 casecompare_talink(ARGS_COMPARE) {
266 	return (compare_talink(rdata1, rdata2));
267 }
268 
269 #endif	/* RDATA_GENERIC_TALINK_58_C */
270