[BACK]Return to afsdb_18.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / mpl / bind / dist / lib / dns / rdata / generic

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, &region);
                     79:        num = uint16_fromregion(&region);
                     80:        isc_region_consume(&region, 2);
                     81:        snprintf(buf, sizeof(buf), "%u ", num);
                     82:        RETERR(str_totext(buf, target));
                     83:        dns_name_fromregion(&name, &region);
                     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, &region1);
                    162:        dns_rdata_toregion(rdata2, &region2);
                    163:
                    164:        isc_region_consume(&region1, 2);
                    165:        isc_region_consume(&region2, 2);
                    166:
                    167:        dns_name_fromregion(&name1, &region1);
                    168:        dns_name_fromregion(&name2, &region2);
                    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, &region);
                    188:        return (isc_buffer_copyregion(target, &region));
                    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, &region);
                    208:
                    209:        afsdb->subtype = uint16_fromregion(&region);
                    210:        isc_region_consume(&region, 2);
                    211:
                    212:        dns_name_init(&name, NULL);
                    213:        dns_name_fromregion(&name, &region);
                    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, &region);
                    244:        isc_region_consume(&region, 2);
                    245:        dns_name_fromregion(&name, &region);
                    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, &region);
                    291:        isc_region_consume(&region, 2);
                    292:        dns_name_init(&name, NULL);
                    293:        dns_name_fromregion(&name, &region);
                    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>