Annotation of src/external/mpl/bind/dist/lib/dns/rdata/generic/afsdb_18.c, Revision 1.1.1.1
1.1 christos 1: /* $NetBSD$ */
2:
3: /*
4: * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5: *
6: * This Source Code Form is subject to the terms of the Mozilla Public
7: * License, v. 2.0. If a copy of the MPL was not distributed with this
8: * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9: *
10: * See the COPYRIGHT file distributed with this work for additional
11: * information regarding copyright ownership.
12: */
13:
14: /* RFC1183 */
15:
16: #ifndef RDATA_GENERIC_AFSDB_18_C
17: #define RDATA_GENERIC_AFSDB_18_C
18:
19: #define RRTYPE_AFSDB_ATTRIBUTES (0)
20:
21: static inline isc_result_t
22: fromtext_afsdb(ARGS_FROMTEXT) {
23: isc_token_t token;
24: isc_buffer_t buffer;
25: dns_name_t name;
26: isc_boolean_t ok;
27:
28: REQUIRE(type == dns_rdatatype_afsdb);
29:
30: UNUSED(type);
31: UNUSED(rdclass);
32: UNUSED(callbacks);
33:
34: /*
35: * Subtype.
36: */
37: RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
38: ISC_FALSE));
39: if (token.value.as_ulong > 0xffffU)
40: RETTOK(ISC_R_RANGE);
41: RETERR(uint16_tobuffer(token.value.as_ulong, target));
42:
43: /*
44: * Hostname.
45: */
46: RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
47: ISC_FALSE));
48: dns_name_init(&name, NULL);
49: buffer_fromregion(&buffer, &token.value.as_region);
50: if (origin == NULL)
51: origin = dns_rootname;
52: RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target));
53: ok = ISC_TRUE;
54: if ((options & DNS_RDATA_CHECKNAMES) != 0)
55: ok = dns_name_ishostname(&name, ISC_FALSE);
56: if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0)
57: RETTOK(DNS_R_BADNAME);
58: if (!ok && callbacks != NULL)
59: warn_badname(&name, lexer, callbacks);
60: return (ISC_R_SUCCESS);
61: }
62:
63: static inline isc_result_t
64: totext_afsdb(ARGS_TOTEXT) {
65: dns_name_t name;
66: dns_name_t prefix;
67: isc_region_t region;
68: char buf[sizeof("64000 ")];
69: isc_boolean_t sub;
70: unsigned int num;
71:
72: REQUIRE(rdata->type == dns_rdatatype_afsdb);
73: REQUIRE(rdata->length != 0);
74:
75: dns_name_init(&name, NULL);
76: dns_name_init(&prefix, NULL);
77:
78: dns_rdata_toregion(rdata, ®ion);
79: num = uint16_fromregion(®ion);
80: isc_region_consume(®ion, 2);
81: snprintf(buf, sizeof(buf), "%u ", num);
82: RETERR(str_totext(buf, target));
83: dns_name_fromregion(&name, ®ion);
84: sub = name_prefix(&name, tctx->origin, &prefix);
85: return (dns_name_totext(&prefix, sub, target));
86: }
87:
88: static inline isc_result_t
89: fromwire_afsdb(ARGS_FROMWIRE) {
90: dns_name_t name;
91: isc_region_t sr;
92: isc_region_t tr;
93:
94: REQUIRE(type == dns_rdatatype_afsdb);
95:
96: UNUSED(type);
97: UNUSED(rdclass);
98:
99: dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
100:
101: dns_name_init(&name, NULL);
102:
103: isc_buffer_activeregion(source, &sr);
104: isc_buffer_availableregion(target, &tr);
105: if (tr.length < 2)
106: return (ISC_R_NOSPACE);
107: if (sr.length < 2)
108: return (ISC_R_UNEXPECTEDEND);
109: memmove(tr.base, sr.base, 2);
110: isc_buffer_forward(source, 2);
111: isc_buffer_add(target, 2);
112: return (dns_name_fromwire(&name, source, dctx, options, target));
113: }
114:
115: static inline isc_result_t
116: towire_afsdb(ARGS_TOWIRE) {
117: isc_region_t tr;
118: isc_region_t sr;
119: dns_name_t name;
120: dns_offsets_t offsets;
121:
122: REQUIRE(rdata->type == dns_rdatatype_afsdb);
123: REQUIRE(rdata->length != 0);
124:
125: dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
126: isc_buffer_availableregion(target, &tr);
127: dns_rdata_toregion(rdata, &sr);
128: if (tr.length < 2)
129: return (ISC_R_NOSPACE);
130: memmove(tr.base, sr.base, 2);
131: isc_region_consume(&sr, 2);
132: isc_buffer_add(target, 2);
133:
134: dns_name_init(&name, offsets);
135: dns_name_fromregion(&name, &sr);
136:
137: return (dns_name_towire(&name, cctx, target));
138: }
139:
140: static inline int
141: compare_afsdb(ARGS_COMPARE) {
142: int result;
143: dns_name_t name1;
144: dns_name_t name2;
145: isc_region_t region1;
146: isc_region_t region2;
147:
148: REQUIRE(rdata1->type == rdata2->type);
149: REQUIRE(rdata1->rdclass == rdata2->rdclass);
150: REQUIRE(rdata1->type == dns_rdatatype_afsdb);
151: REQUIRE(rdata1->length != 0);
152: REQUIRE(rdata2->length != 0);
153:
154: result = memcmp(rdata1->data, rdata2->data, 2);
155: if (result != 0)
156: return (result < 0 ? -1 : 1);
157:
158: dns_name_init(&name1, NULL);
159: dns_name_init(&name2, NULL);
160:
161: dns_rdata_toregion(rdata1, ®ion1);
162: dns_rdata_toregion(rdata2, ®ion2);
163:
164: isc_region_consume(®ion1, 2);
165: isc_region_consume(®ion2, 2);
166:
167: dns_name_fromregion(&name1, ®ion1);
168: dns_name_fromregion(&name2, ®ion2);
169:
170: return (dns_name_rdatacompare(&name1, &name2));
171: }
172:
173: static inline isc_result_t
174: fromstruct_afsdb(ARGS_FROMSTRUCT) {
175: dns_rdata_afsdb_t *afsdb = source;
176: isc_region_t region;
177:
178: REQUIRE(type == dns_rdatatype_afsdb);
179: REQUIRE(source != NULL);
180: REQUIRE(afsdb->common.rdclass == rdclass);
181: REQUIRE(afsdb->common.rdtype == type);
182:
183: UNUSED(type);
184: UNUSED(rdclass);
185:
186: RETERR(uint16_tobuffer(afsdb->subtype, target));
187: dns_name_toregion(&afsdb->server, ®ion);
188: return (isc_buffer_copyregion(target, ®ion));
189: }
190:
191: static inline isc_result_t
192: tostruct_afsdb(ARGS_TOSTRUCT) {
193: isc_region_t region;
194: dns_rdata_afsdb_t *afsdb = target;
195: dns_name_t name;
196:
197: REQUIRE(rdata->type == dns_rdatatype_afsdb);
198: REQUIRE(target != NULL);
199: REQUIRE(rdata->length != 0);
200:
201: afsdb->common.rdclass = rdata->rdclass;
202: afsdb->common.rdtype = rdata->type;
203: ISC_LINK_INIT(&afsdb->common, link);
204:
205: dns_name_init(&afsdb->server, NULL);
206:
207: dns_rdata_toregion(rdata, ®ion);
208:
209: afsdb->subtype = uint16_fromregion(®ion);
210: isc_region_consume(®ion, 2);
211:
212: dns_name_init(&name, NULL);
213: dns_name_fromregion(&name, ®ion);
214:
215: RETERR(name_duporclone(&name, mctx, &afsdb->server));
216: afsdb->mctx = mctx;
217: return (ISC_R_SUCCESS);
218: }
219:
220: static inline void
221: freestruct_afsdb(ARGS_FREESTRUCT) {
222: dns_rdata_afsdb_t *afsdb = source;
223:
224: REQUIRE(source != NULL);
225: REQUIRE(afsdb->common.rdtype == dns_rdatatype_afsdb);
226:
227: if (afsdb->mctx == NULL)
228: return;
229:
230: dns_name_free(&afsdb->server, afsdb->mctx);
231: afsdb->mctx = NULL;
232: }
233:
234: static inline isc_result_t
235: additionaldata_afsdb(ARGS_ADDLDATA) {
236: dns_name_t name;
237: dns_offsets_t offsets;
238: isc_region_t region;
239:
240: REQUIRE(rdata->type == dns_rdatatype_afsdb);
241:
242: dns_name_init(&name, offsets);
243: dns_rdata_toregion(rdata, ®ion);
244: isc_region_consume(®ion, 2);
245: dns_name_fromregion(&name, ®ion);
246:
247: return ((add)(arg, &name, dns_rdatatype_a));
248: }
249:
250: static inline isc_result_t
251: digest_afsdb(ARGS_DIGEST) {
252: isc_region_t r1, r2;
253: dns_name_t name;
254:
255: REQUIRE(rdata->type == dns_rdatatype_afsdb);
256:
257: dns_rdata_toregion(rdata, &r1);
258: r2 = r1;
259: isc_region_consume(&r2, 2);
260: r1.length = 2;
261: RETERR((digest)(arg, &r1));
262: dns_name_init(&name, NULL);
263: dns_name_fromregion(&name, &r2);
264:
265: return (dns_name_digest(&name, digest, arg));
266: }
267:
268: static inline isc_boolean_t
269: checkowner_afsdb(ARGS_CHECKOWNER) {
270:
271: REQUIRE(type == dns_rdatatype_afsdb);
272:
273: UNUSED(name);
274: UNUSED(type);
275: UNUSED(rdclass);
276: UNUSED(wildcard);
277:
278: return (ISC_TRUE);
279: }
280:
281: static inline isc_boolean_t
282: checknames_afsdb(ARGS_CHECKNAMES) {
283: isc_region_t region;
284: dns_name_t name;
285:
286: REQUIRE(rdata->type == dns_rdatatype_afsdb);
287:
288: UNUSED(owner);
289:
290: dns_rdata_toregion(rdata, ®ion);
291: isc_region_consume(®ion, 2);
292: dns_name_init(&name, NULL);
293: dns_name_fromregion(&name, ®ion);
294: if (!dns_name_ishostname(&name, ISC_FALSE)) {
295: if (bad != NULL)
296: dns_name_clone(&name, bad);
297: return (ISC_FALSE);
298: }
299: return (ISC_TRUE);
300: }
301:
302: static inline int
303: casecompare_afsdb(ARGS_COMPARE) {
304: return (compare_afsdb(rdata1, rdata2));
305: }
306: #endif /* RDATA_GENERIC_AFSDB_18_C */
CVSweb <webmaster@jp.NetBSD.org>