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, ®ion1);
142 dns_rdata_toregion(rdata2, ®ion2);
143 return (isc_region_compare(®ion1, ®ion2));
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, ®ion);
160 RETERR(isc_buffer_copyregion(target, ®ion));
161 dns_name_toregion(&talink->next, ®ion);
162 return(isc_buffer_copyregion(target, ®ion));
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, ®ion);
181
182 dns_name_init(&name, NULL);
183 dns_name_fromregion(&name, ®ion);
184 isc_region_consume(®ion, name_length(&name));
185 dns_name_init(&talink->prev, NULL);
186 RETERR(name_duporclone(&name, mctx, &talink->prev));
187
188 dns_name_fromregion(&name, ®ion);
189 isc_region_consume(®ion, 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