00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef GENERIC_CAA_257_C
00018 #define GENERIC_CAA_257_C 1
00019
00020 #define RRTYPE_CAA_ATTRIBUTES (0)
00021
00022 static unsigned char const alphanumeric[256] = {
00023 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00024 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00025 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00026 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
00027 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00028 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
00029 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00030 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
00031 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00032 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00033 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00034 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00035 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00036 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00037 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00038 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00039 };
00040
00041 static inline isc_result_t
00042 fromtext_caa(ARGS_FROMTEXT) {
00043 isc_token_t token;
00044 isc_textregion_t tr;
00045 isc_uint8_t flags;
00046 unsigned int i;
00047
00048 REQUIRE(type == 257);
00049
00050 UNUSED(type);
00051 UNUSED(rdclass);
00052 UNUSED(origin);
00053 UNUSED(options);
00054 UNUSED(callbacks);
00055
00056
00057 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
00058 ISC_FALSE));
00059 if (token.value.as_ulong > 255U)
00060 RETTOK(ISC_R_RANGE);
00061 flags = token.value.as_ulong & 255U;
00062 RETERR(uint8_tobuffer(flags, target));
00063
00064
00065
00066
00067 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
00068 ISC_FALSE));
00069 tr = token.value.as_textregion;
00070 for (i = 0; i < tr.length; i++)
00071 if (!alphanumeric[(unsigned char) tr.base[i]])
00072 RETTOK(DNS_R_SYNTAX);
00073 RETERR(uint8_tobuffer(tr.length, target));
00074 RETERR(mem_tobuffer(target, tr.base, tr.length));
00075
00076
00077
00078
00079 RETERR(isc_lex_getmastertoken(lexer, &token,
00080 isc_tokentype_qstring, ISC_FALSE));
00081 if (token.type != isc_tokentype_qstring &&
00082 token.type != isc_tokentype_string)
00083 RETERR(DNS_R_SYNTAX);
00084 RETERR(multitxt_fromtext(&token.value.as_textregion, target));
00085 return (ISC_R_SUCCESS);
00086 }
00087
00088 static inline isc_result_t
00089 totext_caa(ARGS_TOTEXT) {
00090 isc_region_t region;
00091 isc_uint8_t flags;
00092 char buf[256];
00093
00094 UNUSED(tctx);
00095
00096 REQUIRE(rdata->type == 257);
00097 REQUIRE(rdata->length >= 3U);
00098 REQUIRE(rdata->data != NULL);
00099
00100 dns_rdata_toregion(rdata, ®ion);
00101
00102
00103
00104
00105 flags = uint8_consume_fromregion(®ion);
00106 sprintf(buf, "%u ", flags);
00107 RETERR(str_totext(buf, target));
00108
00109
00110
00111
00112 RETERR(txt_totext(®ion, ISC_FALSE, target));
00113 RETERR(str_totext(" ", target));
00114
00115
00116
00117
00118 RETERR(multitxt_totext(®ion, target));
00119 return (ISC_R_SUCCESS);
00120 }
00121
00122 static inline isc_result_t
00123 fromwire_caa(ARGS_FROMWIRE) {
00124 isc_region_t sr;
00125 unsigned int len, i;
00126
00127 REQUIRE(type == 257);
00128
00129 UNUSED(type);
00130 UNUSED(rdclass);
00131 UNUSED(dctx);
00132 UNUSED(options);
00133
00134
00135
00136
00137 isc_buffer_activeregion(source, &sr);
00138 if (sr.length < 2)
00139 return (ISC_R_UNEXPECTEDEND);
00140
00141
00142
00143
00144 RETERR(mem_tobuffer(target, sr.base, 2));
00145 len = sr.base[1];
00146 isc_region_consume(&sr, 2);
00147 isc_buffer_forward(source, 2);
00148
00149
00150
00151
00152 if (sr.length < len || len == 0)
00153 RETERR(DNS_R_FORMERR);
00154
00155
00156 for (i = 0; i < len; i++)
00157 if (!alphanumeric[sr.base[i]])
00158 RETERR(DNS_R_FORMERR);
00159
00160
00161
00162 isc_buffer_forward(source, sr.length);
00163 return (mem_tobuffer(target, sr.base, sr.length));
00164 }
00165
00166 static inline isc_result_t
00167 towire_caa(ARGS_TOWIRE) {
00168 isc_region_t region;
00169
00170 REQUIRE(rdata->type == 257);
00171 REQUIRE(rdata->length >= 3U);
00172 REQUIRE(rdata->data != NULL);
00173
00174 UNUSED(cctx);
00175
00176 dns_rdata_toregion(rdata, ®ion);
00177 return (mem_tobuffer(target, region.base, region.length));
00178 }
00179
00180 static inline int
00181 compare_caa(ARGS_COMPARE) {
00182 isc_region_t r1, r2;
00183
00184 REQUIRE(rdata1->type == rdata2->type);
00185 REQUIRE(rdata1->rdclass == rdata2->rdclass);
00186 REQUIRE(rdata1->type == 257);
00187 REQUIRE(rdata1->length >= 3U);
00188 REQUIRE(rdata2->length >= 3U);
00189 REQUIRE(rdata1->data != NULL);
00190 REQUIRE(rdata2->data != NULL);
00191
00192 dns_rdata_toregion(rdata1, &r1);
00193 dns_rdata_toregion(rdata2, &r2);
00194 return (isc_region_compare(&r1, &r2));
00195 }
00196
00197 static inline isc_result_t
00198 fromstruct_caa(ARGS_FROMSTRUCT) {
00199 dns_rdata_caa_t *caa = source;
00200 isc_region_t region;
00201 unsigned int i;
00202
00203 REQUIRE(type == 257);
00204 REQUIRE(source != NULL);
00205 REQUIRE(caa->common.rdtype == type);
00206 REQUIRE(caa->common.rdclass == rdclass);
00207 REQUIRE(caa->tag != NULL && caa->tag_len != 0);
00208 REQUIRE(caa->value != NULL);
00209
00210 UNUSED(type);
00211 UNUSED(rdclass);
00212
00213
00214
00215
00216 RETERR(uint8_tobuffer(caa->flags, target));
00217
00218
00219
00220
00221 RETERR(uint8_tobuffer(caa->tag_len, target));
00222
00223
00224
00225
00226 region.base = caa->tag;
00227 region.length = caa->tag_len;
00228 for (i = 0; i < region.length; i++)
00229 if (!alphanumeric[region.base[i]])
00230 RETERR(DNS_R_SYNTAX);
00231 RETERR(isc_buffer_copyregion(target, ®ion));
00232
00233
00234
00235
00236 region.base = caa->value;
00237 region.length = caa->value_len;
00238 return (isc_buffer_copyregion(target, ®ion));
00239 }
00240
00241 static inline isc_result_t
00242 tostruct_caa(ARGS_TOSTRUCT) {
00243 dns_rdata_caa_t *caa = target;
00244 isc_region_t sr;
00245
00246 REQUIRE(rdata->type == 257);
00247 REQUIRE(target != NULL);
00248 REQUIRE(rdata->length >= 3U);
00249 REQUIRE(rdata->data != NULL);
00250
00251 caa->common.rdclass = rdata->rdclass;
00252 caa->common.rdtype = rdata->type;
00253 ISC_LINK_INIT(&caa->common, link);
00254
00255 dns_rdata_toregion(rdata, &sr);
00256
00257
00258
00259
00260 if (sr.length < 1)
00261 return (ISC_R_UNEXPECTEDEND);
00262 caa->flags = uint8_fromregion(&sr);
00263 isc_region_consume(&sr, 1);
00264
00265
00266
00267
00268 if (sr.length < 1)
00269 return (ISC_R_UNEXPECTEDEND);
00270 caa->tag_len = uint8_fromregion(&sr);
00271 isc_region_consume(&sr, 1);
00272
00273
00274
00275
00276 if (sr.length < caa->tag_len)
00277 return (ISC_R_UNEXPECTEDEND);
00278 caa->tag = mem_maybedup(mctx, sr.base, caa->tag_len);
00279 if (caa->tag == NULL)
00280 return (ISC_R_NOMEMORY);
00281 isc_region_consume(&sr, caa->tag_len);
00282
00283
00284
00285
00286 caa->value_len = sr.length;
00287 caa->value = mem_maybedup(mctx, sr.base, sr.length);
00288 if (caa->value == NULL)
00289 return (ISC_R_NOMEMORY);
00290
00291 caa->mctx = mctx;
00292 return (ISC_R_SUCCESS);
00293 }
00294
00295 static inline void
00296 freestruct_caa(ARGS_FREESTRUCT) {
00297 dns_rdata_caa_t *caa = (dns_rdata_caa_t *) source;
00298
00299 REQUIRE(source != NULL);
00300 REQUIRE(caa->common.rdtype == 257);
00301
00302 if (caa->mctx == NULL)
00303 return;
00304
00305 if (caa->tag != NULL)
00306 isc_mem_free(caa->mctx, caa->tag);
00307 if (caa->value != NULL)
00308 isc_mem_free(caa->mctx, caa->value);
00309 caa->mctx = NULL;
00310 }
00311
00312 static inline isc_result_t
00313 additionaldata_caa(ARGS_ADDLDATA) {
00314 REQUIRE(rdata->type == 257);
00315 REQUIRE(rdata->data != NULL);
00316 REQUIRE(rdata->length >= 3U);
00317
00318 UNUSED(rdata);
00319 UNUSED(add);
00320 UNUSED(arg);
00321
00322 return (ISC_R_SUCCESS);
00323 }
00324
00325 static inline isc_result_t
00326 digest_caa(ARGS_DIGEST) {
00327 isc_region_t r;
00328
00329 REQUIRE(rdata->type == 257);
00330 REQUIRE(rdata->data != NULL);
00331 REQUIRE(rdata->length >= 3U);
00332
00333 dns_rdata_toregion(rdata, &r);
00334
00335 return ((digest)(arg, &r));
00336 }
00337
00338 static inline isc_boolean_t
00339 checkowner_caa(ARGS_CHECKOWNER) {
00340
00341 REQUIRE(type == 257);
00342
00343 UNUSED(name);
00344 UNUSED(type);
00345 UNUSED(rdclass);
00346 UNUSED(wildcard);
00347
00348 return (ISC_TRUE);
00349 }
00350
00351 static inline isc_boolean_t
00352 checknames_caa(ARGS_CHECKNAMES) {
00353
00354 REQUIRE(rdata->type == 257);
00355 REQUIRE(rdata->data != NULL);
00356 REQUIRE(rdata->length >= 3U);
00357
00358 UNUSED(rdata);
00359 UNUSED(owner);
00360 UNUSED(bad);
00361
00362 return (ISC_TRUE);
00363 }
00364
00365 static inline int
00366 casecompare_caa(ARGS_COMPARE) {
00367 return (compare_caa(rdata1, rdata2));
00368 }
00369
00370 #endif