Commit ef67e6d8 authored by Mark Andrews's avatar Mark Andrews
Browse files

1859. [func] Add support for CH A record. [RT #14695]

parent f4545143
......@@ -21,7 +21,7 @@
1860. [placeholder] rt14775
1859. [placeholder] rt14695
1859. [func] Add support for CH A record. [RT #14695]
1858. [bug] The flush-zones-on-shutdown option wasn't being
parsed. [RT #14686]
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: gen.c,v 1.75 2005/04/29 00:22:46 marka Exp $ */
/* $Id: gen.c,v 1.76 2005/06/04 00:18:53 marka Exp $ */
/*! \file */
......@@ -831,13 +831,10 @@ main(int argc, char **argv) {
} while (0)
for (cc = classes; cc != NULL; cc = cc->next) {
if (cc->rdclass == 4) {
PRINTCLASS("ch", 3);
if (cc->rdclass == 3)
PRINTCLASS("chaos", 3);
} else if (cc->rdclass == 255) {
else if (cc->rdclass == 255)
PRINTCLASS("none", 254);
}
PRINTCLASS(cc->classname, cc->rdclass);
}
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: master.c,v 1.153 2005/05/19 04:59:02 marka Exp $ */
/* $Id: master.c,v 1.154 2005/06/04 00:18:54 marka Exp $ */
/*! \file */
......@@ -714,6 +714,7 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
case dns_rdatatype_a:
case dns_rdatatype_aaaa:
if (lctx->zclass == dns_rdataclass_in ||
lctx->zclass == dns_rdataclass_ch ||
lctx->zclass == dns_rdataclass_hs)
break;
/* FALLTHROUGH */
......
/*
* Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/* by Bjorn.Victor@it.uu.se, 2005-05-07 */
/* Based on generic/soa_6.c and generic/mx_15.c */
#ifndef RDATA_CH_3_A_1_C
#define RDATA_CH_3_A_1_C
#include <isc/net.h>
#define RRTYPE_A_ATTRIBUTES (0)
static inline isc_result_t
fromtext_ch_a(ARGS_FROMTEXT) {
isc_token_t token;
dns_name_t name;
isc_buffer_t buffer;
REQUIRE(type == 1);
REQUIRE(rdclass == dns_rdataclass_ch); /* 3 */
UNUSED(type);
UNUSED(callbacks);
RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
ISC_FALSE));
/* get domain name */
dns_name_init(&name, NULL);
buffer_fromregion(&buffer, &token.value.as_region);
origin = (origin != NULL) ? origin : dns_rootname;
RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target));
if ((options & DNS_RDATA_CHECKNAMES) != 0 &&
(options & DNS_RDATA_CHECKREVERSE) != 0) {
isc_boolean_t ok;
ok = dns_name_ishostname(&name, ISC_FALSE);
if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0)
RETTOK(DNS_R_BADNAME);
if (!ok && callbacks != NULL)
warn_badname(&name, lexer, callbacks);
}
/* 16-bit octal address */
RETERR(isc_lex_getoctaltoken(lexer, &token, ISC_FALSE));
if (token.value.as_ulong > 0xffff)
RETTOK(ISC_R_RANGE);
return (uint16_tobuffer(token.value.as_ulong, target));
}
static inline isc_result_t
totext_ch_a(ARGS_TOTEXT) {
isc_region_t region;
dns_name_t name;
dns_name_t prefix;
isc_boolean_t sub;
char buf[sizeof("0177777")];
isc_uint16_t addr;
REQUIRE(rdata->type == 1);
REQUIRE(rdata->rdclass == dns_rdataclass_ch); /* 3 */
REQUIRE(rdata->length != 0);
dns_name_init(&name, NULL);
dns_name_init(&prefix, NULL);
dns_rdata_toregion(rdata, &region);
dns_name_fromregion(&name, &region);
isc_region_consume(&region, name_length(&name));
addr = uint16_fromregion(&region);
sub = name_prefix(&name, tctx->origin, &prefix);
RETERR(dns_name_totext(&prefix, sub, target));
sprintf(buf, "%o", addr); /* note octal */
RETERR(str_totext(" ", target));
return (str_totext(buf, target));
}
static inline isc_result_t
fromwire_ch_a(ARGS_FROMWIRE) {
isc_region_t sregion;
isc_region_t tregion;
dns_name_t name;
REQUIRE(type == 1);
REQUIRE(rdclass == dns_rdataclass_ch);
UNUSED(type);
UNUSED(rdclass);
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
dns_name_init(&name, NULL);
RETERR(dns_name_fromwire(&name, source, dctx, options, target));
isc_buffer_activeregion(source, &sregion);
isc_buffer_availableregion(target, &tregion);
if (sregion.length < 2)
return (ISC_R_UNEXPECTEDEND);
if (tregion.length < 2)
return (ISC_R_NOSPACE);
memcpy(tregion.base, sregion.base, 2);
isc_buffer_forward(source, 2);
isc_buffer_add(target, 2);
return (ISC_R_SUCCESS);
}
static inline isc_result_t
towire_ch_a(ARGS_TOWIRE) {
dns_name_t name;
dns_offsets_t offsets;
isc_region_t sregion;
isc_region_t tregion;
REQUIRE(rdata->type == 1);
REQUIRE(rdata->rdclass == dns_rdataclass_ch);
REQUIRE(rdata->length != 0);
dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
dns_name_init(&name, offsets);
dns_rdata_toregion(rdata, &sregion);
dns_name_fromregion(&name, &sregion);
isc_region_consume(&sregion, name_length(&name));
RETERR(dns_name_towire(&name, cctx, target));
isc_buffer_availableregion(target, &tregion);
if (tregion.length < 2)
return (ISC_R_NOSPACE);
memcpy(tregion.base, sregion.base, 2);
isc_buffer_add(target, 2);
return (ISC_R_SUCCESS);
}
static inline int
compare_ch_a(ARGS_COMPARE) {
dns_name_t name1;
dns_name_t name2;
isc_region_t region1;
isc_region_t region2;
int order;
REQUIRE(rdata1->type == rdata2->type);
REQUIRE(rdata1->rdclass == rdata2->rdclass);
REQUIRE(rdata1->type == 1);
REQUIRE(rdata1->rdclass == dns_rdataclass_ch);
REQUIRE(rdata1->length != 0);
REQUIRE(rdata2->length != 0);
dns_name_init(&name1, NULL);
dns_name_init(&name2, NULL);
dns_rdata_toregion(rdata1, &region1);
dns_rdata_toregion(rdata2, &region2);
dns_name_fromregion(&name1, &region1);
dns_name_fromregion(&name2, &region2);
isc_region_consume(&region1, name_length(&name1));
isc_region_consume(&region2, name_length(&name2));
order = dns_name_rdatacompare(&name1, &name2);
if (order != 0)
return (order);
order = memcmp(rdata1->data, rdata2->data, 2);
if (order != 0)
order = (order < 0) ? -1 : 1;
return (order);
}
static inline isc_result_t
fromstruct_ch_a(ARGS_FROMSTRUCT) {
dns_rdata_ch_a_t *a = source;
isc_region_t region;
REQUIRE(type == 1);
REQUIRE(source != NULL);
REQUIRE(a->common.rdtype == type);
REQUIRE(a->common.rdclass == rdclass);
UNUSED(type);
UNUSED(rdclass);
dns_name_toregion(&a->ch_addr_dom, &region);
RETERR(isc_buffer_copyregion(target, &region));
return (uint16_tobuffer(ntohs(a->ch_addr), target));
}
static inline isc_result_t
tostruct_ch_a(ARGS_TOSTRUCT) {
dns_rdata_ch_a_t *a = target;
isc_region_t region;
dns_name_t name;
REQUIRE(rdata->type == 1);
REQUIRE(rdata->rdclass == dns_rdataclass_ch);
REQUIRE(rdata->length != 0);
a->common.rdclass = rdata->rdclass;
a->common.rdtype = rdata->type;
ISC_LINK_INIT(&a->common, link);
dns_rdata_toregion(rdata, &region);
dns_name_init(&name, NULL);
dns_name_fromregion(&name, &region);
isc_region_consume(&region, name_length(&name));
dns_name_init(&a->ch_addr_dom, NULL);
RETERR(name_duporclone(&name, mctx, &a->ch_addr_dom));
a->ch_addr = htons(uint16_fromregion(&region));
a->mctx = mctx;
return (ISC_R_SUCCESS);
}
static inline void
freestruct_ch_a(ARGS_FREESTRUCT) {
dns_rdata_ch_a_t *a = source;
REQUIRE(source != NULL);
REQUIRE(a->common.rdtype == 1);
if (a->mctx == NULL)
return;
dns_name_free(&a->ch_addr_dom, a->mctx);
a->mctx = NULL;
}
static inline isc_result_t
additionaldata_ch_a(ARGS_ADDLDATA) {
REQUIRE(rdata->type == 1);
REQUIRE(rdata->rdclass == dns_rdataclass_ch);
UNUSED(rdata);
UNUSED(add);
UNUSED(arg);
return (ISC_R_SUCCESS);
}
static inline isc_result_t
digest_ch_a(ARGS_DIGEST) {
isc_region_t r;
dns_name_t name;
REQUIRE(rdata->type == 1);
REQUIRE(rdata->rdclass == dns_rdataclass_ch);
dns_rdata_toregion(rdata, &r);
dns_name_init(&name, NULL);
dns_name_fromregion(&name, &r);
isc_region_consume(&r, name_length(&name));
RETERR(dns_name_digest(&name, digest, arg));
return ((digest)(arg, &r));
}
static inline isc_boolean_t
checkowner_ch_a(ARGS_CHECKOWNER) {
REQUIRE(type == 1);
REQUIRE(rdclass == dns_rdataclass_ch);
UNUSED(type);
return (dns_name_ishostname(name, wildcard));
}
static inline isc_boolean_t
checknames_ch_a(ARGS_CHECKNAMES) {
isc_region_t region;
dns_name_t name;
REQUIRE(rdata->type == 1);
REQUIRE(rdata->rdclass == dns_rdataclass_ch);
UNUSED(owner);
dns_rdata_toregion(rdata, &region);
dns_name_init(&name, NULL);
dns_name_fromregion(&name, &region);
if (!dns_name_ishostname(&name, ISC_FALSE)) {
if (bad != NULL)
dns_name_clone(&name, bad);
return (ISC_FALSE);
}
return (ISC_TRUE);
}
#endif /* RDATA_CH_3_A_1_C */
/*
* Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/* by Bjorn.Victor@it.uu.se, 2005-05-07 */
/* Based on generic/mx_15.h */
#ifndef CH_3_A_1_H
#define CH_3_A_1_H 1
typedef isc_uint16_t ch_addr_t;
typedef struct dns_rdata_ch_a {
dns_rdatacommon_t common;
isc_mem_t *mctx;
dns_name_t ch_addr_dom; /* ch-addr domain for back mapping */
ch_addr_t ch_addr; /* chaos address (16 bit) network order */
} dns_rdata_ch_a_t;
#endif /* CH_3_A_1_H */
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: lex.h,v 1.32 2005/04/29 00:23:38 marka Exp $ */
/* $Id: lex.h,v 1.33 2005/06/04 00:18:55 marka Exp $ */
#ifndef ISC_LEX_H
#define ISC_LEX_H 1
......@@ -86,9 +86,10 @@ ISC_LANG_BEGINDECLS
#define ISC_LEXOPT_DNSMULTILINE 0x20 /*%< Handle '(' and ')'. */
#define ISC_LEXOPT_NOMORE 0x40 /*%< Want "no more" token. */
#define ISC_LEXOPT_CNUMBER 0x80 /*%< Regognize octal and hex */
#define ISC_LEXOPT_CNUMBER 0x80 /*%< Regognize octal and hex. */
#define ISC_LEXOPT_ESCAPE 0x100 /*%< Recognize escapes. */
#define ISC_LEXOPT_QSTRINGMULTILINE 0x200 /*%< Allow multiline "" strings */
#define ISC_LEXOPT_OCTAL 0x400 /*%< Expect a octal number. */
/*@}*/
/*@{*/
/*!
......@@ -323,6 +324,23 @@ isc_lex_getmastertoken(isc_lex_t *lex, isc_token_t *token,
* \li any return code from isc_lex_gettoken().
*/
isc_result_t
isc_lex_getoctaltoken(isc_lex_t *lex, isc_token_t *token, isc_boolean_t eol);
/*%<
* Get the next token from a DNS master file type stream. This is a
* convenience function that sets appropriate options and handles end
* of line correctly for master files. It also ungets unexpected tokens.
*
* Requires:
*\li 'lex' is a valid lexer.
*
*\li 'token' is a valid pointer
*
* Returns:
*
* \li any return code from isc_lex_gettoken().
*/
void
isc_lex_ungettoken(isc_lex_t *lex, isc_token_t *tokenp);
/*%<
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: lex.c,v 1.81 2005/04/29 00:23:27 marka Exp $ */
/* $Id: lex.c,v 1.82 2005/06/04 00:18:55 marka Exp $ */
/*! \file */
......@@ -565,7 +565,11 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
} else if (isdigit((unsigned char)c) &&
(options & ISC_LEXOPT_NUMBER) != 0) {
lex->last_was_eol = ISC_FALSE;
state = lexstate_number;
if ((options & ISC_LEXOPT_OCTAL) != 0 &&
(c == '8' || c == '9'))
state = lexstate_string;
else
state = lexstate_number;
goto no_read;
} else {
lex->last_was_eol = ISC_FALSE;
......@@ -586,7 +590,9 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
c == '\n' || c == EOF ||
lex->specials[c]) {
int base;
if ((options & ISC_LEXOPT_CNUMBER) != 0)
if ((options & ISC_LEXOPT_OCTAL) != 0)
base = 8;
else if ((options & ISC_LEXOPT_CNUMBER) != 0)
base = 0;
else
base = 10;
......@@ -621,6 +627,9 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
(lex->data[0] != '0'))) {
/* Above test supports hex numbers */
state = lexstate_string;
} else if ((options & ISC_LEXOPT_OCTAL) != 0 &&
(c == '8' || c == '9')) {
state = lexstate_string;
}
}
if (remaining == 0U) {
......@@ -819,6 +828,33 @@ isc_lex_getmastertoken(isc_lex_t *lex, isc_token_t *token,
return (ISC_R_SUCCESS);
}
isc_result_t
isc_lex_getoctaltoken(isc_lex_t *lex, isc_token_t *token, isc_boolean_t eol)
{
unsigned int options = ISC_LEXOPT_EOL | ISC_LEXOPT_EOF |
ISC_LEXOPT_DNSMULTILINE | ISC_LEXOPT_ESCAPE|
ISC_LEXOPT_NUMBER | ISC_LEXOPT_OCTAL;
isc_result_t result;
result = isc_lex_gettoken(lex, options, token);
if (result == ISC_R_RANGE)
isc_lex_ungettoken(lex, token);
if (result != ISC_R_SUCCESS)
return (result);
if (eol && ((token->type == isc_tokentype_eol) ||
(token->type == isc_tokentype_eof)))
return (ISC_R_SUCCESS);
if (token->type != isc_tokentype_number) {
isc_lex_ungettoken(lex, token);
if (token->type == isc_tokentype_eol ||
token->type == isc_tokentype_eof)
return (ISC_R_UNEXPECTEDEND);
return (ISC_R_BADNUMBER);
}
return (ISC_R_SUCCESS);
}
void
isc_lex_ungettoken(isc_lex_t *lex, isc_token_t *tokenp) {
inputsource *source;
......
......@@ -1744,6 +1744,8 @@
./lib/dns/rdata.c C 1998,1999,2000,2001,2002,2003,2004,2005
./lib/dns/rdata/any_255/tsig_250.c C 1999,2000,2001,2002,2003,2004,2005
./lib/dns/rdata/any_255/tsig_250.h C 1999,2000,2001,2004,2005
./lib/dns/rdata/ch_3/a_1.c C 2005
./lib/dns/rdata/ch_3/a_1.h C 2005
./lib/dns/rdata/generic/afsdb_18.c C 1999,2000,2001,2003,2004,2005
./lib/dns/rdata/generic/afsdb_18.h C 1999,2000,2001,2004,2005
./lib/dns/rdata/generic/cert_37.c C 1999,2000,2001,2002,2003,2004,2005
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment