2 * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC")
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.
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.
17 #ifndef RDATA_GENERIC_LP_107_C
18 #define RDATA_GENERIC_LP_107_C
24 #define RRTYPE_LP_ATTRIBUTES (0)
26 static inline isc_result_t
27 fromtext_lp(ARGS_FROMTEXT) {
38 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
40 if (token.value.as_ulong > 0xffffU)
42 RETERR(uint16_tobuffer(token.value.as_ulong, target));
44 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
47 dns_name_init(&name, NULL);
48 buffer_fromregion(&buffer, &token.value.as_region);
49 origin = (origin != NULL) ? origin : dns_rootname;
50 return (dns_name_fromtext(&name, &buffer, origin, options, target));
53 static inline isc_result_t
54 totext_lp(ARGS_TOTEXT) {
59 char buf[sizeof("64000")];
62 REQUIRE(rdata->type == 107);
63 REQUIRE(rdata->length != 0);
65 dns_name_init(&name, NULL);
66 dns_name_init(&prefix, NULL);
68 dns_rdata_toregion(rdata, ®ion);
69 num = uint16_fromregion(®ion);
70 isc_region_consume(®ion, 2);
71 sprintf(buf, "%u", num);
72 RETERR(str_totext(buf, target));
74 RETERR(str_totext(" ", target));
76 dns_name_fromregion(&name, ®ion);
77 sub = name_prefix(&name, tctx->origin, &prefix);
78 return (dns_name_totext(&prefix, sub, target));
81 static inline isc_result_t
82 fromwire_lp(ARGS_FROMWIRE) {
91 dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
93 dns_name_init(&name, NULL);
95 isc_buffer_activeregion(source, &sregion);
96 if (sregion.length < 2)
97 return (ISC_R_UNEXPECTEDEND);
98 RETERR(mem_tobuffer(target, sregion.base, 2));
99 isc_buffer_forward(source, 2);
100 return (dns_name_fromwire(&name, source, dctx, options, target));
103 static inline isc_result_t
104 towire_lp(ARGS_TOWIRE) {
106 REQUIRE(rdata->type == 107);
107 REQUIRE(rdata->length != 0);
111 return (mem_tobuffer(target, rdata->data, rdata->length));
115 compare_lp(ARGS_COMPARE) {
116 isc_region_t region1;
117 isc_region_t region2;
119 REQUIRE(rdata1->type == rdata2->type);
120 REQUIRE(rdata1->rdclass == rdata2->rdclass);
121 REQUIRE(rdata1->type == 107);
122 REQUIRE(rdata1->length != 0);
123 REQUIRE(rdata2->length != 0);
125 dns_rdata_toregion(rdata1, ®ion1);
126 dns_rdata_toregion(rdata2, ®ion2);
128 return (isc_region_compare(®ion1, ®ion2));
131 static inline isc_result_t
132 fromstruct_lp(ARGS_FROMSTRUCT) {
133 dns_rdata_lp_t *lp = source;
136 REQUIRE(type == 107);
137 REQUIRE(source != NULL);
138 REQUIRE(lp->common.rdtype == type);
139 REQUIRE(lp->common.rdclass == rdclass);
144 RETERR(uint16_tobuffer(lp->pref, target));
145 dns_name_toregion(&lp->lp, ®ion);
146 return (isc_buffer_copyregion(target, ®ion));
149 static inline isc_result_t
150 tostruct_lp(ARGS_TOSTRUCT) {
152 dns_rdata_lp_t *lp = target;
155 REQUIRE(rdata->type == 107);
156 REQUIRE(target != NULL);
157 REQUIRE(rdata->length != 0);
159 lp->common.rdclass = rdata->rdclass;
160 lp->common.rdtype = rdata->type;
161 ISC_LINK_INIT(&lp->common, link);
163 dns_name_init(&name, NULL);
164 dns_rdata_toregion(rdata, ®ion);
165 lp->pref = uint16_fromregion(®ion);
166 isc_region_consume(®ion, 2);
167 dns_name_fromregion(&name, ®ion);
168 dns_name_init(&lp->lp, NULL);
169 RETERR(name_duporclone(&name, mctx, &lp->lp));
171 return (ISC_R_SUCCESS);
175 freestruct_lp(ARGS_FREESTRUCT) {
176 dns_rdata_lp_t *lp = source;
178 REQUIRE(source != NULL);
179 REQUIRE(lp->common.rdtype == 107);
181 if (lp->mctx == NULL)
184 dns_name_free(&lp->lp, lp->mctx);
188 static inline isc_result_t
189 additionaldata_lp(ARGS_ADDLDATA) {
191 dns_offsets_t offsets;
195 REQUIRE(rdata->type == 107);
197 dns_name_init(&name, offsets);
198 dns_rdata_toregion(rdata, ®ion);
199 isc_region_consume(®ion, 2);
200 dns_name_fromregion(&name, ®ion);
202 result = (add)(arg, &name, dns_rdatatype_l32);
203 if (result != ISC_R_SUCCESS)
205 return ((add)(arg, &name, dns_rdatatype_l64));
208 static inline isc_result_t
209 digest_lp(ARGS_DIGEST) {
212 REQUIRE(rdata->type == 107);
214 dns_rdata_toregion(rdata, ®ion);
215 return ((digest)(arg, ®ion));
218 static inline isc_boolean_t
219 checkowner_lp(ARGS_CHECKOWNER) {
221 REQUIRE(type == 107);
231 static inline isc_boolean_t
232 checknames_lp(ARGS_CHECKNAMES) {
234 REQUIRE(rdata->type == 107);
243 casecompare_lp(ARGS_COMPARE) {
246 isc_region_t region1;
247 isc_region_t region2;
250 REQUIRE(rdata1->type == rdata2->type);
251 REQUIRE(rdata1->rdclass == rdata2->rdclass);
252 REQUIRE(rdata1->type == 107);
253 REQUIRE(rdata1->length != 0);
254 REQUIRE(rdata2->length != 0);
256 order = memcmp(rdata1->data, rdata2->data, 2);
258 return (order < 0 ? -1 : 1);
260 dns_name_init(&name1, NULL);
261 dns_name_init(&name2, NULL);
263 dns_rdata_toregion(rdata1, ®ion1);
264 dns_rdata_toregion(rdata2, ®ion2);
266 isc_region_consume(®ion1, 2);
267 isc_region_consume(®ion2, 2);
269 dns_name_fromregion(&name1, ®ion1);
270 dns_name_fromregion(&name2, ®ion2);
272 return (dns_name_rdatacompare(&name1, &name2));
275 #endif /* RDATA_GENERIC_LP_107_C */