1 /* $NetBSD: mg_8.c,v 1.4 2019/11/27 05:48:42 christos Exp $ */ 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 #ifndef RDATA_GENERIC_MG_8_C 15 #define RDATA_GENERIC_MG_8_C 16 17 #define RRTYPE_MG_ATTRIBUTES (0) 18 19 static inline isc_result_t 20 fromtext_mg(ARGS_FROMTEXT) { 21 isc_token_t token; 22 dns_name_t name; 23 isc_buffer_t buffer; 24 25 REQUIRE(type == dns_rdatatype_mg); 26 27 UNUSED(type); 28 UNUSED(rdclass); 29 UNUSED(callbacks); 30 31 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 32 false)); 33 34 dns_name_init(&name, NULL); 35 buffer_fromregion(&buffer, &token.value.as_region); 36 if (origin == NULL) 37 origin = dns_rootname; 38 RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target)); 39 return (ISC_R_SUCCESS); 40 } 41 42 static inline isc_result_t 43 totext_mg(ARGS_TOTEXT) { 44 isc_region_t region; 45 dns_name_t name; 46 dns_name_t prefix; 47 bool sub; 48 49 REQUIRE(rdata->type == dns_rdatatype_mg); 50 REQUIRE(rdata->length != 0); 51 52 dns_name_init(&name, NULL); 53 dns_name_init(&prefix, NULL); 54 55 dns_rdata_toregion(rdata, ®ion); 56 dns_name_fromregion(&name, ®ion); 57 58 sub = name_prefix(&name, tctx->origin, &prefix); 59 60 return (dns_name_totext(&prefix, sub, target)); 61 } 62 63 static inline isc_result_t 64 fromwire_mg(ARGS_FROMWIRE) { 65 dns_name_t name; 66 67 REQUIRE(type == dns_rdatatype_mg); 68 69 UNUSED(type); 70 UNUSED(rdclass); 71 72 dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14); 73 74 dns_name_init(&name, NULL); 75 return (dns_name_fromwire(&name, source, dctx, options, target)); 76 } 77 78 static inline isc_result_t 79 towire_mg(ARGS_TOWIRE) { 80 dns_name_t name; 81 dns_offsets_t offsets; 82 isc_region_t region; 83 84 REQUIRE(rdata->type == dns_rdatatype_mg); 85 REQUIRE(rdata->length != 0); 86 87 dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); 88 89 dns_name_init(&name, offsets); 90 dns_rdata_toregion(rdata, ®ion); 91 dns_name_fromregion(&name, ®ion); 92 93 return (dns_name_towire(&name, cctx, target)); 94 } 95 96 static inline int 97 compare_mg(ARGS_COMPARE) { 98 dns_name_t name1; 99 dns_name_t name2; 100 isc_region_t region1; 101 isc_region_t region2; 102 103 REQUIRE(rdata1->type == rdata2->type); 104 REQUIRE(rdata1->rdclass == rdata2->rdclass); 105 REQUIRE(rdata1->type == dns_rdatatype_mg); 106 REQUIRE(rdata1->length != 0); 107 REQUIRE(rdata2->length != 0); 108 109 dns_name_init(&name1, NULL); 110 dns_name_init(&name2, NULL); 111 112 dns_rdata_toregion(rdata1, ®ion1); 113 dns_rdata_toregion(rdata2, ®ion2); 114 115 dns_name_fromregion(&name1, ®ion1); 116 dns_name_fromregion(&name2, ®ion2); 117 118 return (dns_name_rdatacompare(&name1, &name2)); 119 } 120 121 static inline isc_result_t 122 fromstruct_mg(ARGS_FROMSTRUCT) { 123 dns_rdata_mg_t *mg = source; 124 isc_region_t region; 125 126 REQUIRE(type == dns_rdatatype_mg); 127 REQUIRE(mg != NULL); 128 REQUIRE(mg->common.rdtype == type); 129 REQUIRE(mg->common.rdclass == rdclass); 130 131 UNUSED(type); 132 UNUSED(rdclass); 133 134 dns_name_toregion(&mg->mg, ®ion); 135 return (isc_buffer_copyregion(target, ®ion)); 136 } 137 138 static inline isc_result_t 139 tostruct_mg(ARGS_TOSTRUCT) { 140 isc_region_t region; 141 dns_rdata_mg_t *mg = target; 142 dns_name_t name; 143 144 REQUIRE(rdata->type == dns_rdatatype_mg); 145 REQUIRE(mg != NULL); 146 REQUIRE(rdata->length != 0); 147 148 mg->common.rdclass = rdata->rdclass; 149 mg->common.rdtype = rdata->type; 150 ISC_LINK_INIT(&mg->common, link); 151 152 dns_name_init(&name, NULL); 153 dns_rdata_toregion(rdata, ®ion); 154 dns_name_fromregion(&name, ®ion); 155 dns_name_init(&mg->mg, NULL); 156 RETERR(name_duporclone(&name, mctx, &mg->mg)); 157 mg->mctx = mctx; 158 return (ISC_R_SUCCESS); 159 } 160 161 static inline void 162 freestruct_mg(ARGS_FREESTRUCT) { 163 dns_rdata_mg_t *mg = source; 164 165 REQUIRE(mg != NULL); 166 REQUIRE(mg->common.rdtype == dns_rdatatype_mg); 167 168 if (mg->mctx == NULL) 169 return; 170 dns_name_free(&mg->mg, mg->mctx); 171 mg->mctx = NULL; 172 } 173 174 static inline isc_result_t 175 additionaldata_mg(ARGS_ADDLDATA) { 176 REQUIRE(rdata->type == dns_rdatatype_mg); 177 178 UNUSED(add); 179 UNUSED(arg); 180 UNUSED(rdata); 181 182 return (ISC_R_SUCCESS); 183 } 184 185 static inline isc_result_t 186 digest_mg(ARGS_DIGEST) { 187 isc_region_t r; 188 dns_name_t name; 189 190 REQUIRE(rdata->type == dns_rdatatype_mg); 191 192 dns_rdata_toregion(rdata, &r); 193 dns_name_init(&name, NULL); 194 dns_name_fromregion(&name, &r); 195 196 return (dns_name_digest(&name, digest, arg)); 197 } 198 199 static inline bool 200 checkowner_mg(ARGS_CHECKOWNER) { 201 202 REQUIRE(type == dns_rdatatype_mg); 203 204 UNUSED(type); 205 UNUSED(rdclass); 206 UNUSED(wildcard); 207 208 return (dns_name_ismailbox(name)); 209 } 210 211 static inline bool 212 checknames_mg(ARGS_CHECKNAMES) { 213 214 REQUIRE(rdata->type == dns_rdatatype_mg); 215 216 UNUSED(rdata); 217 UNUSED(owner); 218 UNUSED(bad); 219 220 return (true); 221 } 222 223 static inline int 224 casecompare_mg(ARGS_COMPARE) { 225 return (compare_mg(rdata1, rdata2)); 226 } 227 228 #endif /* RDATA_GENERIC_MG_8_C */ 229