version 1.4, 2019/11/27 05:48:42 |
version 1.5, 2020/05/24 19:46:24 |
Line 28 fromtext_nxt(ARGS_FROMTEXT) { |
|
Line 28 fromtext_nxt(ARGS_FROMTEXT) { |
|
dns_name_t name; |
dns_name_t name; |
isc_buffer_t buffer; |
isc_buffer_t buffer; |
char *e; |
char *e; |
unsigned char bm[8*1024]; /* 64k bits */ |
unsigned char bm[8 * 1024]; /* 64k bits */ |
dns_rdatatype_t covered; |
dns_rdatatype_t covered; |
dns_rdatatype_t maxcovered = 0; |
dns_rdatatype_t maxcovered = 0; |
bool first = true; |
bool first = true; |
Line 47 fromtext_nxt(ARGS_FROMTEXT) { |
|
Line 47 fromtext_nxt(ARGS_FROMTEXT) { |
|
false)); |
false)); |
dns_name_init(&name, NULL); |
dns_name_init(&name, NULL); |
buffer_fromregion(&buffer, &token.value.as_region); |
buffer_fromregion(&buffer, &token.value.as_region); |
if (origin == NULL) |
if (origin == NULL) { |
origin = dns_rootname; |
origin = dns_rootname; |
|
} |
RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target)); |
RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target)); |
|
|
memset(bm, 0, sizeof(bm)); |
memset(bm, 0, sizeof(bm)); |
do { |
do { |
RETERR(isc_lex_getmastertoken(lexer, &token, |
RETERR(isc_lex_getmastertoken(lexer, &token, |
isc_tokentype_string, true)); |
isc_tokentype_string, true)); |
if (token.type != isc_tokentype_string) |
if (token.type != isc_tokentype_string) { |
break; |
break; |
|
} |
n = strtol(DNS_AS_STR(token), &e, 10); |
n = strtol(DNS_AS_STR(token), &e, 10); |
if (e != DNS_AS_STR(token) && *e == '\0') { |
if (e != DNS_AS_STR(token) && *e == '\0') { |
covered = (dns_rdatatype_t)n; |
covered = (dns_rdatatype_t)n; |
} else if (dns_rdatatype_fromtext(&covered, |
} else if (dns_rdatatype_fromtext(&covered, |
&token.value.as_textregion) == DNS_R_UNKNOWN) |
&token.value.as_textregion) == |
|
DNS_R_UNKNOWN) |
|
{ |
RETTOK(DNS_R_UNKNOWN); |
RETTOK(DNS_R_UNKNOWN); |
|
} |
/* |
/* |
* NXT is only specified for types 1..127. |
* NXT is only specified for types 1..127. |
*/ |
*/ |
if (covered < 1 || covered > 127) |
if (covered < 1 || covered > 127) { |
return (ISC_R_RANGE); |
return (ISC_R_RANGE); |
if (first || covered > maxcovered) |
} |
|
if (first || covered > maxcovered) { |
maxcovered = covered; |
maxcovered = covered; |
|
} |
first = false; |
first = false; |
bm[covered/8] |= (0x80>>(covered%8)); |
bm[covered / 8] |= (0x80 >> (covered % 8)); |
} while (1); |
} while (1); |
isc_lex_ungettoken(lexer, &token); |
isc_lex_ungettoken(lexer, &token); |
if (first) |
if (first) { |
return (ISC_R_SUCCESS); |
return (ISC_R_SUCCESS); |
|
} |
n = (maxcovered + 8) / 8; |
n = (maxcovered + 8) / 8; |
return (mem_tobuffer(target, bm, n)); |
return (mem_tobuffer(target, bm, n)); |
} |
} |
Line 100 totext_nxt(ARGS_TOTEXT) { |
|
Line 108 totext_nxt(ARGS_TOTEXT) { |
|
RETERR(dns_name_totext(&prefix, sub, target)); |
RETERR(dns_name_totext(&prefix, sub, target)); |
|
|
for (i = 0; i < sr.length; i++) { |
for (i = 0; i < sr.length; i++) { |
if (sr.base[i] != 0) |
if (sr.base[i] != 0) { |
for (j = 0; j < 8; j++) |
for (j = 0; j < 8; j++) { |
if ((sr.base[i] & (0x80 >> j)) != 0) { |
if ((sr.base[i] & (0x80 >> j)) != 0) { |
dns_rdatatype_t t = i * 8 + j; |
{ |
RETERR(str_totext(" ", target)); |
dns_rdatatype_t t = i * 8 + j; |
if (dns_rdatatype_isknown(t)) { |
RETERR(str_totext(" ", target)); |
RETERR(dns_rdatatype_totext(t, |
if (dns_rdatatype_isknown(t)) { |
target)); |
RETERR(dns_rdatatype_totext( |
} else { |
t, target)); |
char buf[sizeof("65535")]; |
} else { |
snprintf(buf, sizeof(buf), |
char buf[sizeof("6553" |
"%u", t); |
"5")]; |
RETERR(str_totext(buf, |
snprintf(buf, |
target)); |
sizeof(buf), |
|
"%u", t); |
|
RETERR(str_totext( |
|
buf, target)); |
|
} |
} |
} |
} |
} |
|
} |
|
} |
} |
} |
return (ISC_R_SUCCESS); |
return (ISC_R_SUCCESS); |
} |
} |
Line 138 fromwire_nxt(ARGS_FROMWIRE) { |
|
Line 152 fromwire_nxt(ARGS_FROMWIRE) { |
|
isc_buffer_activeregion(source, &sr); |
isc_buffer_activeregion(source, &sr); |
if (sr.length > 0 && (sr.base[0] & 0x80) == 0 && |
if (sr.length > 0 && (sr.base[0] & 0x80) == 0 && |
((sr.length > 16) || sr.base[sr.length - 1] == 0)) |
((sr.length > 16) || sr.base[sr.length - 1] == 0)) |
|
{ |
return (DNS_R_BADBITMAP); |
return (DNS_R_BADBITMAP); |
|
} |
RETERR(mem_tobuffer(target, sr.base, sr.length)); |
RETERR(mem_tobuffer(target, sr.base, sr.length)); |
isc_buffer_forward(source, sr.length); |
isc_buffer_forward(source, sr.length); |
return (ISC_R_SUCCESS); |
return (ISC_R_SUCCESS); |
Line 184 compare_nxt(ARGS_COMPARE) { |
|
Line 200 compare_nxt(ARGS_COMPARE) { |
|
dns_name_fromregion(&name1, &r1); |
dns_name_fromregion(&name1, &r1); |
dns_name_fromregion(&name2, &r2); |
dns_name_fromregion(&name2, &r2); |
order = dns_name_rdatacompare(&name1, &name2); |
order = dns_name_rdatacompare(&name1, &name2); |
if (order != 0) |
if (order != 0) { |
return (order); |
return (order); |
|
} |
|
|
isc_region_consume(&r1, name_length(&name1)); |
isc_region_consume(&r1, name_length(&name1)); |
isc_region_consume(&r2, name_length(&name2)); |
isc_region_consume(&r2, name_length(&name2)); |
Line 240 tostruct_nxt(ARGS_TOSTRUCT) { |
|
Line 257 tostruct_nxt(ARGS_TOSTRUCT) { |
|
|
|
nxt->len = region.length; |
nxt->len = region.length; |
nxt->typebits = mem_maybedup(mctx, region.base, region.length); |
nxt->typebits = mem_maybedup(mctx, region.base, region.length); |
if (nxt->typebits == NULL) |
if (nxt->typebits == NULL) { |
goto cleanup; |
goto cleanup; |
|
} |
|
|
nxt->mctx = mctx; |
nxt->mctx = mctx; |
return (ISC_R_SUCCESS); |
return (ISC_R_SUCCESS); |
|
|
cleanup: |
cleanup: |
if (mctx != NULL) |
if (mctx != NULL) { |
dns_name_free(&nxt->next, mctx); |
dns_name_free(&nxt->next, mctx); |
|
} |
return (ISC_R_NOMEMORY); |
return (ISC_R_NOMEMORY); |
} |
} |
|
|
Line 259 freestruct_nxt(ARGS_FREESTRUCT) { |
|
Line 278 freestruct_nxt(ARGS_FREESTRUCT) { |
|
REQUIRE(nxt != NULL); |
REQUIRE(nxt != NULL); |
REQUIRE(nxt->common.rdtype == dns_rdatatype_nxt); |
REQUIRE(nxt->common.rdtype == dns_rdatatype_nxt); |
|
|
if (nxt->mctx == NULL) |
if (nxt->mctx == NULL) { |
return; |
return; |
|
} |
|
|
dns_name_free(&nxt->next, nxt->mctx); |
dns_name_free(&nxt->next, nxt->mctx); |
if (nxt->typebits != NULL) |
if (nxt->typebits != NULL) { |
isc_mem_free(nxt->mctx, nxt->typebits); |
isc_mem_free(nxt->mctx, nxt->typebits); |
|
} |
nxt->mctx = NULL; |
nxt->mctx = NULL; |
} |
} |
|
|
Line 291 digest_nxt(ARGS_DIGEST) { |
|
Line 312 digest_nxt(ARGS_DIGEST) { |
|
dns_name_init(&name, NULL); |
dns_name_init(&name, NULL); |
dns_name_fromregion(&name, &r); |
dns_name_fromregion(&name, &r); |
result = dns_name_digest(&name, digest, arg); |
result = dns_name_digest(&name, digest, arg); |
if (result != ISC_R_SUCCESS) |
if (result != ISC_R_SUCCESS) { |
return (result); |
return (result); |
|
} |
isc_region_consume(&r, name_length(&name)); |
isc_region_consume(&r, name_length(&name)); |
|
|
return ((digest)(arg, &r)); |
return ((digest)(arg, &r)); |
Line 300 digest_nxt(ARGS_DIGEST) { |
|
Line 322 digest_nxt(ARGS_DIGEST) { |
|
|
|
static inline bool |
static inline bool |
checkowner_nxt(ARGS_CHECKOWNER) { |
checkowner_nxt(ARGS_CHECKOWNER) { |
|
|
REQUIRE(type == dns_rdatatype_nxt); |
REQUIRE(type == dns_rdatatype_nxt); |
|
|
UNUSED(name); |
UNUSED(name); |
Line 313 checkowner_nxt(ARGS_CHECKOWNER) { |
|
Line 334 checkowner_nxt(ARGS_CHECKOWNER) { |
|
|
|
static inline bool |
static inline bool |
checknames_nxt(ARGS_CHECKNAMES) { |
checknames_nxt(ARGS_CHECKNAMES) { |
|
|
REQUIRE(rdata->type == dns_rdatatype_nxt); |
REQUIRE(rdata->type == dns_rdatatype_nxt); |
|
|
UNUSED(rdata); |
UNUSED(rdata); |
Line 327 static inline int |
|
Line 347 static inline int |
|
casecompare_nxt(ARGS_COMPARE) { |
casecompare_nxt(ARGS_COMPARE) { |
return (compare_nxt(rdata1, rdata2)); |
return (compare_nxt(rdata1, rdata2)); |
} |
} |
#endif /* RDATA_GENERIC_NXT_30_C */ |
#endif /* RDATA_GENERIC_NXT_30_C */ |