From: Jelte Jansen Date: Wed, 19 Jan 2005 13:52:05 +0000 (+0000) Subject: added APL printing X-Git-Tag: release-0.50~560 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f959d9ba3ccfb61301f8438ad3a98e2e4d41f0a;p=thirdparty%2Fldns.git added APL printing --- diff --git a/host2str.c b/host2str.c index 11a5d7b7..cf9be0b0 100644 --- a/host2str.c +++ b/host2str.c @@ -482,6 +482,82 @@ ldns_rdf2buffer_tsigtime(ldns_buffer *output, ldns_rdf *rdf) return ldns_buffer_status(output); } +ldns_status +ldns_rdf2buffer_apl(ldns_buffer *output, ldns_rdf *rdf) +{ + uint8_t *data = ldns_rdf_data(rdf); + uint16_t address_family = read_uint16(data); + uint8_t prefix = data[2]; + bool negation; + uint8_t adf_length; + unsigned short i; + unsigned int pos = 0; + +/* + printf("address family: %u\n", address_family); + printf("prefix: %u\n", prefix); + printf("negation: %u\n", negation); + printf("adf length: %u\n", adf_length); +*/ + /* todo: use #defines for address families? */ + + /* ipv4 */ + while (pos < ldns_rdf_size(rdf)) { + address_family = read_uint16(&data[pos]); + prefix = data[pos + 2]; + negation = data[pos + 3] & 0x80; + adf_length = data[pos + 3] & 0x7f; + if (address_family == 1) { + /* check if prefix < 32? */ + if (negation) { + ldns_buffer_printf(output, "!"); + } + ldns_buffer_printf(output, "%u:", address_family); + /* address is variable length 0 - 4 */ + for (i = 0; i < 4; i++) { + if (i > 0) { + ldns_buffer_printf(output, "."); + } + if (i < adf_length) { + ldns_buffer_printf(output, "%d", + data[pos + i + 4]); + } else { + ldns_buffer_printf(output, "0"); + } + } + ldns_buffer_printf(output, "/%u ", prefix); + } else if (address_family == 2) { + /* check if prefix < 128? */ + if (negation) { + ldns_buffer_printf(output, "!"); + } + ldns_buffer_printf(output, "%u:", address_family); + /* address is variable length 0 - 16 */ + for (i = 0; i < 16; i++) { + if (i % 2 == 0 && i > 0) { + ldns_buffer_printf(output, ":"); + } + if (i < adf_length) { + ldns_buffer_printf(output, "%02x", + data[pos + i + 4]); + } else { + ldns_buffer_printf(output, "00"); + } + } + ldns_buffer_printf(output, "/%u ", prefix); + + } else { + /* unknown address family */ + ldns_buffer_printf(output, "Unknown address family: %u data: ", address_family); + for (i = 1; i < 4 + adf_length; i++) { + ldns_buffer_printf(output, "%02x", data[i]); + } + } + pos += 4 + adf_length; + } + return ldns_buffer_status(output); +} + ldns_status ldns_rdf2buffer_todo(ldns_buffer *output, ldns_rdf *rdf) { @@ -527,7 +603,7 @@ ldns_rdf2buffer(ldns_buffer *buffer, ldns_rdf *rdf) res = ldns_rdf2buffer_str(buffer, rdf); break; case LDNS_RDF_TYPE_APL: - res = ldns_rdf2buffer_todo(buffer, rdf); + res = ldns_rdf2buffer_apl(buffer, rdf); break; case LDNS_RDF_TYPE_B64: res = ldns_rdf2buffer_b64(buffer, rdf); diff --git a/rr.c b/rr.c index c864dd0c..c31f78ec 100644 --- a/rr.c +++ b/rr.c @@ -348,6 +348,9 @@ static const ldns_rdf_type type_cert_wireformat[] = { LDNS_RDF_TYPE_CERT, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_B64 }; static const ldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; +static const ldns_rdf_type type_apl_wireformat[] = { + LDNS_RDF_TYPE_APL +}; static const ldns_rdf_type type_ds_wireformat[] = { LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX }; @@ -453,7 +456,7 @@ static ldns_rr_descriptor rdata_field_descriptors[] = { /* 41 */ {LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE }, /* 42 */ - {LDNS_RR_TYPE_APL, "APL", 0, 0, NULL, LDNS_RDF_TYPE_APL }, + {LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL }, /* 43 */ {LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE }, /* 44 */