+
+towire_classname_typename() is required to set the
+allowed name compression methods based on EDNS version if there is a
+domain name in the rdata.
+
+if (dns_compress_getedns(cctx) >= #)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_LOCAL);
+
rdata
-
diff --git a/lib/dns/compress.c b/lib/dns/compress.c
new file mode 100644
index 0000000000..7c63ec9514
--- /dev/null
+++ b/lib/dns/compress.c
@@ -0,0 +1,439 @@
+/*
+ * Copyright (C) 1999 Internet Software Consortium.
+ *
+ * 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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM 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.
+ */
+
+ /* $Id: compress.c,v 1.1 1999/02/22 07:23:54 marka Exp $ */
+
+#include
+
+#include
+#include
+#include
+
+#include
+
+#define CCTX_MAGIC 0x43435458U
+#define VALID_CCTX(x) ((x) != NULL && (x)->magic == CCTX_MAGIC)
+
+static void free_offset(void *offset, void *mctx);
+isc_boolean_t compress_find(dns_rbt_t *root, dns_name_t *name,
+ dns_name_t *prefix, dns_name_t *suffix,
+ isc_uint16_t *offset,
+ isc_buffer_t *workspace);
+void compress_add(dns_rbt_t *root, dns_name_t *prefix,
+ dns_name_t *suffix, isc_uint16_t offset,
+ isc_boolean_t global16, isc_mem_t *mctx);
+
+
+dns_result_t
+dns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx)
+{
+ dns_result_t result;
+
+ REQUIRE(cctx != NULL);
+ REQUIRE(mctx != NULL);
+
+ cctx->allowed = 0;
+ cctx->rdata = 0;
+ cctx->global16 = (edns >= 1) ? ISC_TRUE : ISC_FALSE;
+ cctx->edns = edns;
+ cctx->local = NULL;
+ cctx->global = NULL;
+ result = dns_rbt_create(mctx, free_offset, mctx, &cctx->global);
+ if (result != DNS_R_SUCCESS)
+ return (result);
+ cctx->mctx = mctx;
+ cctx->magic = CCTX_MAGIC;
+ return (DNS_R_SUCCESS);
+}
+
+dns_result_t
+dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
+ isc_buffer_t *target)
+{
+ dns_result_t result;
+ unsigned int labels;
+ unsigned int ll, wl;
+ unsigned int bits;
+ dns_name_t name;
+ dns_name_t prefix;
+ dns_name_t suffix;
+ dns_label_t label;
+ isc_uint16_t *data;
+ unsigned char buf[34];
+ unsigned char namebuf[255];
+ isc_buffer_t t;
+ isc_region_t region;
+
+
+ REQUIRE(VALID_CCTX(cctx));
+ REQUIRE(cctx->local == NULL);
+ REQUIRE(dns_name_isabsolute(owner) == ISC_TRUE);
+ REQUIRE(target != NULL);
+
+ result = dns_rbt_create(cctx->mctx, free_offset, cctx->mctx,
+ &cctx->local);
+ if (result != DNS_R_SUCCESS)
+ return (result);
+
+ /*
+ * Errors from here on are not passed back up.
+ */
+ cctx->rdata = target->used; /* XXX layer violation */
+ labels = dns_name_countlabels(owner);
+ ll = 0;
+ wl = 0;
+ dns_name_init(&name, NULL);
+ dns_name_init(&prefix, NULL);
+ dns_name_init(&suffix, NULL);
+ /*
+ * XXX we should be adding all the logical label in a
+ * bit stream as well.
+ * See also compress_add().
+ */
+ while (labels > 0) {
+ dns_name_getlabelsequence(owner, wl, labels, &name);
+ data = isc_mem_get(cctx->mctx, sizeof *data);
+ if (data != NULL)
+ return (DNS_R_SUCCESS);
+ *data = ll;
+ result = dns_rbt_addname(cctx->local, &name, data);
+ if (result != DNS_R_SUCCESS) {
+ isc_mem_put(cctx->mctx, data, sizeof *data);
+ return (DNS_R_SUCCESS);
+ }
+ labels --;
+ wl++;
+ ll++;
+ if (ll > 255)
+ return (DNS_R_SUCCESS);
+ dns_name_getlabel(&name, 0, &label);
+ if (dns_label_type(&label) != dns_labeltype_bitstring)
+ continue;
+ bits = dns_label_countbits(&label);
+ if (bits == 1)
+ continue;
+ INSIST(label.length < sizeof buf);
+ memcpy(buf, label.base, label.length);
+ region.base = buf;
+ dns_name_getlabelsequence(owner, wl, labels, &suffix);
+ do {
+ /* clear bit */
+ buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
+ bits--;
+ region.length = 2 + (bits + 7) / 8;
+ buf[1] = bits;
+ dns_name_fromregion(&prefix, ®ion);
+ isc_buffer_init(&t, namebuf, sizeof namebuf,
+ ISC_BUFFERTYPE_BINARY);
+ result = dns_name_cat(&prefix, &suffix, &name, &t);
+ if (result != DNS_R_SUCCESS)
+ return (DNS_R_SUCCESS);
+ data = isc_mem_get(cctx->mctx, sizeof *data);
+ if (data != NULL)
+ return (DNS_R_SUCCESS);
+ *data = ll;
+ result = dns_rbt_addname(cctx->local, &name, data);
+ if (result != DNS_R_SUCCESS) {
+ isc_mem_put(cctx->mctx, data, sizeof *data);
+ return (DNS_R_SUCCESS);
+ }
+ ll++;
+ if (ll > 255)
+ return (DNS_R_SUCCESS);
+ } while (bits > 1);
+ }
+ return (DNS_R_SUCCESS);
+}
+
+void
+dns_compress_invalidate(dns_compress_t *cctx) {
+
+ REQUIRE(VALID_CCTX(cctx));
+
+ cctx->magic = 0;
+ if (cctx->global != NULL)
+ dns_rbt_destroy(&cctx->global);
+ if (cctx->local != NULL)
+ dns_rbt_destroy(&cctx->local);
+ cctx->allowed = 0;
+ cctx->rdata = 0;
+ cctx->global16 = ISC_FALSE;
+ cctx->edns = -1;
+}
+
+void
+dns_compress_localinvalidate(dns_compress_t *cctx) {
+
+ REQUIRE(VALID_CCTX(cctx));
+
+ if (cctx->local != NULL)
+ dns_rbt_destroy(&cctx->local);
+}
+
+void
+dns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed) {
+ REQUIRE(VALID_CCTX(cctx));
+
+ if (cctx->edns >= 1 && (allowed & DNS_COMPRESS_GLOBAL14) != 0)
+ allowed |= DNS_COMPRESS_GLOBAL16;
+ cctx->allowed = allowed;
+}
+
+unsigned int
+dns_compress_getmethods(dns_compress_t *cctx) {
+ REQUIRE(VALID_CCTX(cctx));
+ return (cctx->allowed);
+}
+
+int
+dns_compress_getedns(dns_compress_t *cctx) {
+ REQUIRE(VALID_CCTX(cctx));
+ return (cctx->edns);
+}
+
+isc_boolean_t
+dns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name,
+ dns_name_t *prefix, dns_name_t *suffix,
+ isc_uint16_t *offset, isc_buffer_t *workspace)
+{
+ REQUIRE(VALID_CCTX(cctx));
+ REQUIRE(dns_name_isabsolute(name) == ISC_TRUE);
+ REQUIRE(offset != NULL);
+
+ return (compress_find(cctx->global, name, prefix, suffix, offset,
+ workspace));
+}
+
+isc_boolean_t
+dns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name,
+ dns_name_t *prefix, dns_name_t *suffix,
+ isc_uint16_t *offset, isc_buffer_t *workspace)
+{
+ REQUIRE(VALID_CCTX(cctx));
+ REQUIRE(dns_name_isabsolute(name) == ISC_TRUE);
+ REQUIRE(offset != NULL);
+
+ if (cctx->local == NULL)
+ return (ISC_FALSE);
+ return (compress_find(cctx->local, name, prefix, suffix, offset,
+ workspace));
+}
+
+void
+dns_compress_add(dns_compress_t *cctx, dns_name_t *prefix,
+ dns_name_t *suffix, isc_uint16_t offset)
+{
+ isc_uint16_t local;
+ REQUIRE(VALID_CCTX(cctx));
+
+ if (cctx->local != NULL && (cctx->allowed & DNS_COMPRESS_LOCAL) != 0) {
+ REQUIRE(cctx->rdata <= offset);
+ local = offset - cctx->rdata + 256;
+ compress_add(cctx->local, prefix, suffix, local, ISC_TRUE,
+ cctx->mctx);
+ }
+ compress_add(cctx->global, prefix, suffix, offset, cctx->global16,
+ cctx->mctx);
+}
+
+void
+dns_compress_backout(dns_compress_t *cctx, isc_uint16_t offset) {
+ REQUIRE(VALID_CCTX(cctx));
+
+ /* XXX need tree walking code */
+}
+
+/***
+ *** Private
+ ***/
+
+static void
+free_offset(void *offset, void *mctx) {
+ REQUIRE(offset != NULL);
+ REQUIRE(mctx != NULL);
+ isc_mem_put(mctx, offset, sizeof(isc_uint16_t));
+}
+
+/*
+ * Add the labels in prefix to RBT.
+ */
+void
+compress_add(dns_rbt_t *root, dns_name_t *prefix, dns_name_t *suffix,
+ isc_uint16_t offset, isc_boolean_t global16, isc_mem_t *mctx)
+{
+
+ dns_name_t name;
+ dns_name_t full;
+ dns_label_t label;
+ unsigned int count;
+ unsigned int start;
+ unsigned int limit;
+ isc_uint16_t *data;
+ dns_result_t result;
+ unsigned char buffer[255];
+ isc_buffer_t target;
+ dns_offsets_t offsets;
+
+ count = dns_name_countlabels(prefix);
+ limit = dns_name_isabsolute(prefix) ? 1 : 0;
+ start = 0;
+ dns_name_init(&full, offsets);
+ dns_name_init(&name, NULL);
+ while (count > limit) {
+ if (offset >= 16384 && !global16)
+ break;
+ dns_name_getlabelsequence(prefix, start, count, &name);
+ isc_buffer_init(&target, buffer, sizeof buffer,
+ ISC_BUFFERTYPE_BINARY);
+ result = dns_name_cat(&name, suffix, &full, &target);
+ if (result != DNS_R_SUCCESS)
+ return;
+ data = isc_mem_get(mctx, sizeof *data);
+ if (data == NULL)
+ return;
+ *data = offset;
+ result = dns_rbt_addname(root, &full, data);
+ if (result != DNS_R_SUCCESS) {
+ isc_mem_put(mctx, data, sizeof *data);
+ return;
+ }
+ dns_name_getlabel(&name, 0, &label);
+ offset += label.length;
+ start++;
+ count--;
+ }
+}
+
+/*
+ * Find the loggest match of name in root.
+ * If match is found return ISC_TRUE. prefix, suffix and offset
+ * are updated.
+ * If no match is found return ISC_FALSE.
+ * XXX should used dns_rbt_findlongestmatch() when written.
+ */
+
+isc_boolean_t
+compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
+ dns_name_t *suffix, isc_uint16_t *offset,
+ isc_buffer_t *workspace)
+{
+ unsigned int count;
+ unsigned int labels;
+ unsigned int start;
+ unsigned int bits;
+ isc_uint16_t *data;
+ dns_name_t tmpname;
+ dns_name_t tmpprefix;
+ dns_name_t tmpsuffix;
+ isc_region_t region;
+ unsigned char buf[255];
+ dns_label_t label;
+ unsigned int i, j;
+ dns_result_t result;
+ dns_bitlabel_t bit;
+
+ labels = count = dns_name_countlabels(name);
+ start = 0;
+ data = NULL;
+ bits = 0;
+
+ dns_name_init(&tmpname, NULL);
+ dns_name_init(&tmpsuffix, NULL);
+ dns_name_init(&tmpprefix, NULL);
+ /* Don't look for the root label (count == 1). */
+ while (count > 1) {
+ dns_name_getlabelsequence(name, start, count, &tmpname);
+ data = dns_rbt_findname(root, &tmpname);
+ if (data != NULL)
+ break;
+ count--;
+ start++;
+ if (workspace == NULL)
+ continue;
+ dns_name_getlabel(&tmpname, 0, &label);
+ if (dns_label_type(&label) != dns_labeltype_bitstring)
+ continue;
+ bits = dns_label_countbits(&label);
+ if (bits == 1) {
+ bits = 0;
+ continue;
+ }
+ INSIST(label.length < sizeof buf);
+ memcpy(buf, label.base, label.length);
+ region.base = buf;
+ dns_name_getlabelsequence(name, start, count, &tmpsuffix);
+ do {
+ /* clear lsb */
+ buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
+ bits--;
+ region.length = 2 + (bits + 7) / 8;
+ buf[1] = bits;
+ dns_name_fromregion(&tmpprefix, ®ion);
+ isc_buffer_clear(workspace);
+ result = dns_name_cat(&tmpprefix, &tmpsuffix,
+ &tmpname, workspace);
+ if (result != DNS_R_SUCCESS)
+ continue;
+ data = dns_rbt_findname(root, &tmpname);
+ if (data != NULL)
+ break;
+ if (bits == 1)
+ bits = 0;
+ } while (bits > 1);
+ if (data != NULL)
+ break;
+ }
+ if (data == NULL)
+ return (ISC_FALSE);
+ if (bits == 0) {
+ if (start != 0)
+ dns_name_getlabelsequence(name, 0, start, prefix);
+ dns_name_getlabelsequence(name, start, count, suffix);
+ *offset = *data;
+ return (ISC_TRUE);
+ }
+ *suffix = tmpname;
+ i = dns_label_countbits(&label);
+ j = 0;
+ while (bits < i) {
+ bit = dns_label_getbit(&label, bits);
+ bits++;
+ if (bit)
+ buf[2 + j / 8] |= (1 << (7 - (j % 8)));
+ else
+ buf[2 + j / 8] &= ~(1 << (7 - (j % 8)));
+ j++;
+ }
+ buf[1] = j;
+ while ((j % 8) != 0) {
+ buf[2 + j / 8] &= ~(1 << (7 - (j % 8)));
+ j++;
+ }
+ region.base = buf;
+ region.length = 2 + j / 8;
+ dns_name_fromregion(&tmpsuffix, ®ion);
+ if (start == 1)
+ tmpprefix = *dns_rootname;
+ else
+ dns_name_getlabelsequence(name, 0, start - 1, &tmpprefix);
+ result = dns_name_cat(&tmpprefix, &tmpsuffix, &tmpname, workspace);
+ if (result != DNS_R_SUCCESS)
+ return (ISC_FALSE);
+ dns_name_getlabelsequence(&tmpname, 0, start, prefix);
+ *offset = *data;
+ return (ISC_TRUE);
+}
diff --git a/lib/dns/include/dns/compress.h b/lib/dns/include/dns/compress.h
index fd0e957bb2..299ca44cb2 100644
--- a/lib/dns/include/dns/compress.h
+++ b/lib/dns/include/dns/compress.h
@@ -21,10 +21,14 @@
#include
#include
+#include
+#define DNS_COMPRESS_NONE 0x00 /* no compression */
#define DNS_COMPRESS_GLOBAL14 0x01 /* "normal" compression. */
#define DNS_COMPRESS_GLOBAL16 0x02 /* 16-bit global comp. */
-#define DNS_COMPRESS_LOCAL 0x04 /* Local compression. */
+#define DNS_COMPRESS_GLOBAL 0x03 /* all global comp. */
+#define DNS_COMPRESS_LOCAL 0x04 /* local compression. */
+#define DNS_COMPRESS_ALL 0x07 /* all compression. */
/*
* XXX An API for manipulating these structures will be forthcoming.
@@ -33,9 +37,14 @@
*/
struct dns_compress {
- unsigned int allowed; /* Allowed methods. */
- dns_name_t owner_name; /* For local compression. */
- /* XXX compression table here */
+ unsigned int magic; /* Magic number. */
+ unsigned int allowed; /* Allowed methods. */
+ unsigned int rdata; /* Start of local rdata. */
+ isc_boolean_t global16; /* 16 bit offsets allowed. */
+ int edns; /* Edns version or -1. */
+ dns_rbt_t *local; /* Local RBT. */
+ dns_rbt_t *global; /* Global RBT. */
+ isc_mem_t *mctx; /* Memeory context. */
};
struct dns_decompress {
@@ -43,4 +52,172 @@ struct dns_decompress {
dns_name_t owner_name; /* For local compression. */
};
+dns_result_t dns_compress_init(dns_compress_t *cctx, int edns,
+ isc_mem_t *mctx);
+/*
+ * Inialise the compression context structure pointed to by 'cctx'.
+ *
+ * Requires:
+ * 'cctx' is a valid dns_compress_t structure.
+ * 'mctx' is a initalised memory context.
+ * Ensures:
+ * cctx->global is initalised.
+ *
+ * Returns:
+ * DNS_R_SUCCESS
+ * failures from dns_rbt_create()
+ */
+
+dns_result_t
+dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
+ isc_buffer_t *target);
+
+/*
+ * Initalise 'cctx->local'.
+ * All compression pointers pointing to logical labels in owner.
+ * Record start of rdata 'target->used'.
+ *
+ * Ensures:
+ * 'cctx->local' is valid.
+ *
+ * Requires:
+ * 'cctx' initaliased
+ * 'cctx->local' be NULL
+ * 'owner' is a absolute name
+ * 'target' is a valid buffer
+ *
+ * Returns:
+ * DNS_R_SUCCESS
+ * failures from dns_rbt_create()
+ */
+
+void
+dns_compress_invalidate(dns_compress_t *cctx);
+
+/*
+ * Invalidate the compression structure pointed to by cctx.
+ * Destroys 'cctx->glocal' and 'cctx->local' RBT.
+ *
+ * Requires:
+ * 'cctx' to be initalised.
+ */
+
+void
+dns_compress_localinvalidate(dns_compress_t *cctx);
+
+/*
+ * Destroys 'cctx->local'.
+ *
+ * Requires:
+ * 'cctx' to be initalised.
+ */
+
+void
+dns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed);
+
+/*
+ * Sets allowed compression methods.
+ *
+ * Requires:
+ * 'cctx' to be initalised.
+ */
+
+unsigned int
+dns_compress_getmethods(dns_compress_t *cctx);
+
+/*
+ * Gets allowed compression methods.
+ *
+ * Requires:
+ * 'cctx' to be initalised.
+ *
+ * Returns:
+ * allowed compression bitmap.
+ */
+
+int
+dns_compress_getedns(dns_compress_t *cctx);
+
+/*
+ * Gets edns value.
+ *
+ * Requires:
+ * 'cctx' to be initalised.
+ *
+ * Returns:
+ * -1 .. 255
+ */
+
+isc_boolean_t
+dns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name,
+ dns_name_t *prefix, dns_name_t *suffix,
+ isc_uint16_t *offset, isc_buffer_t *workspace);
+/*
+ * Finds longest possible match of 'name' in the global compression
+ * RBT. Workspace needs to be large enough to hold 'name' when split
+ * in two (length->name + 3).
+ *
+ * Requires:
+ * 'cctx' to be initalised.
+ * 'name' to be a absolute name.
+ * 'prefix' to be initalised.
+ * 'suffix' to be initalised.
+ * 'offset' to point it a isc_uint16_t.
+ * 'workspace' to be initalised.
+ *
+ * Ensures:
+ * 'prefix', 'suffix' and 'offset' are valid is ISC_TRUE is
+ * returned.
+ *
+ * Returns:
+ * ISC_TRUE / ISC_FALSE
+ */
+
+isc_boolean_t
+dns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name,
+ dns_name_t *prefix, dns_name_t *suffix,
+ isc_uint16_t *offset, isc_buffer_t *workspace);
+
+/*
+ * Finds longest possible match of 'name' in the local compression
+ * RBT. Workspace needs to be large enough to hold 'name' when split
+ * in two (length->name + 3).
+ *
+ * Requires:
+ * 'cctx' to be initalised.
+ * 'name' to be a absolute name.
+ * 'prefix' to be initalised.
+ * 'suffix' to be initalised.
+ * 'offset' to point it a isc_uint16_t.
+ * 'workspace' to be initalised.
+ *
+ * Ensures:
+ * 'prefix', 'suffix' and 'offset' are valid is ISC_TRUE is
+ * returned.
+ *
+ * Returns:
+ * ISC_TRUE / ISC_FALSE
+ */
+
+void
+dns_compress_add(dns_compress_t *cctx, dns_name_t *prefix,
+ dns_name_t *suffix, isc_uint16_t offset);
+/*
+ * Add compression pointers for labels in prefix to RBT's.
+ *
+ * Requires:
+ * 'cctx' initalised
+ * 'prefix' to be initalised
+ */
+
+void
+dns_compress_backout(dns_compress_t *cctx, isc_uint16_t offset);
+
+/*
+ * Remove any compression pointers from global RBT >= offset.
+ *
+ * Requires:
+ * 'cctx' is initalised.
+ */
+
#endif /* DNS_COMPRESS_H */
diff --git a/lib/dns/include/dns/name.h b/lib/dns/include/dns/name.h
index d013636ee7..ff38454399 100644
--- a/lib/dns/include/dns/name.h
+++ b/lib/dns/include/dns/name.h
@@ -663,4 +663,13 @@ dns_result_t dns_name_totext(dns_name_t *name,
* DNS_R_NOSPACE
*/
+dns_result_t dns_name_cat(dns_name_t *prefix, dns_name_t *suffix,
+ dns_name_t *name, isc_buffer_t *target);
+/*
+ * Concatenate 'prefix' & 'suffix' and return the result in 'name'.
+ *
+ * Returns:
+ * DNS_R_SUCCESS
+ * DNS_R_NOSPACE
+ */
#endif /* DNS_NAME_H */
diff --git a/lib/dns/include/dns/rdata.h b/lib/dns/include/dns/rdata.h
index 6f02692baf..3f247b4ae1 100644
--- a/lib/dns/include/dns/rdata.h
+++ b/lib/dns/include/dns/rdata.h
@@ -96,6 +96,7 @@
#include
#include
#include
+#include
/*****
***** RData
diff --git a/lib/dns/name.c b/lib/dns/name.c
index dd9cdc549e..f7d0cce0e0 100644
--- a/lib/dns/name.c
+++ b/lib/dns/name.c
@@ -1863,6 +1863,19 @@ dns_result_t
dns_name_towire(dns_name_t *name, dns_compress_t *cctx,
isc_buffer_t *target)
{
+ unsigned int methods;
+ unsigned int offset;
+ dns_name_t gp, gs;
+ dns_name_t lp, ls;
+ isc_boolean_t gf;
+ isc_boolean_t lf;
+ isc_int16_t go;
+ isc_int16_t lo;
+ unsigned char gb[257];
+ unsigned char lb[257];
+ isc_buffer_t gws;
+ isc_buffer_t lws;
+
/*
* Convert 'name' into wire format, compressing it as specified by the
* compression context 'cctx', and storing the result in 'target'.
@@ -1872,17 +1885,153 @@ dns_name_towire(dns_name_t *name, dns_compress_t *cctx,
REQUIRE(cctx != NULL);
REQUIRE(isc_buffer_type(target) == ISC_BUFFERTYPE_BINARY);
- /*
- * XXX We don't try to compress the name; we just copy the
- * uncompressed version into the target buffer.
- */
+ dns_name_init(&lp, NULL);
+ dns_name_init(&gp, NULL);
+ dns_name_init(&ls, NULL);
+ dns_name_init(&gs, NULL);
+ isc_buffer_init(&gws, gb, sizeof gb, ISC_BUFFERTYPE_BINARY);
+ isc_buffer_init(&lws, lb, sizeof lb, ISC_BUFFERTYPE_BINARY);
- if (target->length - target->used < name->length)
- return (DNS_R_NOSPACE);
- (void)memcpy((unsigned char *)target->base + target->used,
- name->ndata, (size_t)name->length);
+ offset = target->used; /*XXX*/
- isc_buffer_add(target, name->length);
+ methods = dns_compress_getmethods(cctx);
+ if ((methods & DNS_COMPRESS_GLOBAL) != 0)
+ gf = dns_compress_findglobal(cctx, name, &gp, &gs, &go, &gws);
+ else
+ gf = ISC_FALSE;
+
+ if ((methods & DNS_COMPRESS_LOCAL) != 0)
+ lf = dns_compress_findlocal(cctx, name, &lp, &ls, &lo, &lws);
+ else
+ lf = ISC_FALSE;
+
+ /* find the best compression */
+ if (lf && gf) {
+ if (lp.length < gp.length)
+ gf = ISC_FALSE;
+ else
+ lf = ISC_FALSE;
+ }
+
+ if (gf) {
+ if (target->length - target->used < gp.length)
+ return (DNS_R_NOSPACE);
+ (void)memcpy((unsigned char *)target->base + target->used,
+ gp.ndata, (size_t)gp.length);
+ isc_buffer_add(target, gp.length);
+ if (go < 16384) {
+ go |= 0xc000;
+ if (target->length - target->used < 2)
+ return (DNS_R_NOSPACE);
+ isc_buffer_putuint16(target, go);
+ } else {
+ if (target->length - target->used < 3)
+ return (DNS_R_NOSPACE);
+ *((unsigned char*)target->base + target->used) =
+ DNS_LABELTYPE_GLOBALCOMP16;
+ isc_buffer_add(target, 1);
+ isc_buffer_putuint16(target, go);
+ }
+ if (gp.length != 0)
+ dns_compress_add(cctx, &gp, &gs, offset);
+ } else if (lf) {
+ if (target->length - target->used < lp.length)
+ return (DNS_R_NOSPACE);
+ (void)memcpy((unsigned char *)target->base + target->used,
+ lp.ndata, (size_t)lp.length);
+ isc_buffer_add(target, lp.length);
+ if (lo < 16384) {
+ lo |= 0x8000;
+ if (target->length - target->used < 2)
+ return (DNS_R_NOSPACE);
+ isc_buffer_putuint16(target, lo);
+ } else {
+ if (target->length - target->used < 3)
+ return (DNS_R_NOSPACE);
+ *((unsigned char*)target->base + target->used) =
+ DNS_LABELTYPE_LOCALCOMP;
+ isc_buffer_add(target, 1);
+ isc_buffer_putuint16(target, lo);
+ }
+ if (lp.length != 0)
+ dns_compress_add(cctx, &lp, &ls, offset);
+ } else {
+ if (target->length - target->used < name->length)
+ return (DNS_R_NOSPACE);
+ (void)memcpy((unsigned char *)target->base + target->used,
+ name->ndata, (size_t)name->length);
+ isc_buffer_add(target, name->length);
+ dns_compress_add(cctx, name, NULL, offset);
+ }
+ return (DNS_R_SUCCESS);
+}
+
+dns_result_t
+dns_name_cat(dns_name_t *prefix, dns_name_t *suffix, dns_name_t *name,
+ isc_buffer_t *target)
+{
+ unsigned char *ndata;
+ unsigned char *offsets;
+ dns_offsets_t odata;
+ unsigned int nrem;
+ unsigned int labels;
+ unsigned int count;
+
+ REQUIRE(VALID_NAME(name));
+ REQUIRE(VALID_NAME(prefix));
+ if (suffix != NULL)
+ REQUIRE(VALID_NAME(suffix));
+ REQUIRE(isc_buffer_type(target) == ISC_BUFFERTYPE_BINARY);
+ REQUIRE((name->attributes & DNS_NAMEATTR_READONLY) == 0);
+
+ nrem = target->length - target->used;
+ ndata = (unsigned char *)target->base + target->used;
+ if (nrem > 255)
+ nrem = 255;
+ if (dns_name_isabsolute(prefix)) {
+ count = prefix->length - 1;
+ labels = prefix->labels - 1;
+ } else {
+ count = prefix->length;
+ labels = prefix->labels;
+ }
+ if (count > nrem)
+ return (DNS_R_NOSPACE);
+ memcpy(ndata, prefix->ndata, count);
+ nrem -= count;
+ ndata += count;
+
+ /* append suffix */
+ if (suffix != NULL) {
+ if (dns_name_isabsolute(suffix)) {
+ count = suffix->length - 1;
+ labels += suffix->labels - 1;
+ } else {
+ count = suffix->length;
+ labels += suffix->labels;
+ }
+ if (count > nrem)
+ return (DNS_R_NOSPACE);
+ memcpy(ndata, suffix->ndata, count);
+ ndata += count;
+ }
+
+ /* root label */
+ if (nrem < 1)
+ return (DNS_R_NOSPACE);
+ *ndata++ = 0;
+ labels++;
+
+ name->ndata = (unsigned char *)target->base + target->used;
+ name->labels = labels;
+ name->length = ndata - name->ndata;
+ name->attributes |= DNS_NAMEATTR_ABSOLUTE;
+
+ INIT_OFFSETS(name, offsets, odata);
+ set_offsets(name, offsets, ISC_FALSE, ISC_FALSE, ISC_FALSE);
+ compact(name, offsets);
+
+ isc_buffer_add(target, name->length);
return (DNS_R_SUCCESS);
}
diff --git a/lib/dns/rbt.c b/lib/dns/rbt.c
index 5c9a90a191..af14d8d0ec 100644
--- a/lib/dns/rbt.c
+++ b/lib/dns/rbt.c
@@ -253,7 +253,7 @@ dns_rbt_addnode(dns_rbt_t *rbt, dns_name_t *name, dns_rbtnode_t **nodep) {
int compared, add_labels, current_labels, keep_labels, start_label;
dns_result_t result;
dns_rbtnodechain_t chain;
- dns_offsets_t o1, o2;
+ dns_offsets_t o1, o2, new_offset;
isc_region_t r;
REQUIRE(VALID_RBT(rbt));
@@ -410,7 +410,7 @@ dns_rbt_addnode(dns_rbt_t *rbt, dns_name_t *name, dns_rbtnode_t **nodep) {
start_label = 0;
keep_labels = current_labels - compared;
- dns_name_init(&new_name, NULL);
+ dns_name_init(&new_name, new_offset);
dns_name_getlabelsequence(¤t_name,
start_label,
keep_labels,
diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c
index 9e77caa7fb..e66150e045 100644
--- a/lib/dns/rdata.c
+++ b/lib/dns/rdata.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: rdata.c,v 1.35 1999/02/16 22:42:23 marka Exp $ */
+ /* $Id: rdata.c,v 1.36 1999/02/22 07:23:57 marka Exp $ */
#include
@@ -296,9 +296,11 @@ dns_rdata_towire(dns_rdata_t *rdata, dns_compress_t *cctx,
dns_result_t result = DNS_R_NOTIMPLEMENTED;
isc_boolean_t use_default = ISC_FALSE;
isc_region_t tr;
+ isc_buffer_t st;
REQUIRE(rdata != NULL);
REQUIRE(isc_buffer_type(target) == ISC_BUFFERTYPE_BINARY);
+ st = *target;
TOWIRESWITCH
@@ -310,6 +312,10 @@ dns_rdata_towire(dns_rdata_t *rdata, dns_compress_t *cctx,
isc_buffer_add(target, rdata->length);
return (DNS_R_SUCCESS);
}
+ if (result != DNS_R_SUCCESS) {
+ *target = st;
+ dns_compress_backout(cctx, target->used);
+ }
return (result);
}
diff --git a/lib/dns/rdata/any_255/tsig_250.c b/lib/dns/rdata/any_255/tsig_250.c
index a6b9409896..60e8fba979 100644
--- a/lib/dns/rdata/any_255/tsig_250.c
+++ b/lib/dns/rdata/any_255/tsig_250.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: tsig_250.c,v 1.5 1999/02/16 22:42:23 marka Exp $ */
+ /* $Id: tsig_250.c,v 1.6 1999/02/22 07:23:59 marka Exp $ */
/* draft-ietf-dnsind-tsig-07.txt */
@@ -234,7 +234,10 @@ towire_any_tsig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target)
REQUIRE(rdata->type == 250);
REQUIRE(rdata->class == 255);
- cctx = cctx; /*unused*/
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
dns_rdata_toregion(rdata, &sr);
dns_name_init(&name, NULL);
diff --git a/lib/dns/rdata/any_255/tsig_250.h b/lib/dns/rdata/any_255/tsig_250.h
index d057a4c975..1ddbf309cc 100644
--- a/lib/dns/rdata/any_255/tsig_250.h
+++ b/lib/dns/rdata/any_255/tsig_250.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: tsig_250.h,v 1.5 1999/02/16 22:42:23 marka Exp $ */
+ /* $Id: tsig_250.h,v 1.6 1999/02/22 07:23:59 marka Exp $ */
/* draft-ietf-dnsind-tsig-07.txt */
@@ -234,7 +234,10 @@ towire_any_tsig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target)
REQUIRE(rdata->type == 250);
REQUIRE(rdata->class == 255);
- cctx = cctx; /*unused*/
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
dns_rdata_toregion(rdata, &sr);
dns_name_init(&name, NULL);
diff --git a/lib/dns/rdata/generic/afsdb_18.c b/lib/dns/rdata/generic/afsdb_18.c
index 2744983eeb..5df369f670 100644
--- a/lib/dns/rdata/generic/afsdb_18.c
+++ b/lib/dns/rdata/generic/afsdb_18.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: afsdb_18.c,v 1.3 1999/02/16 22:42:23 marka Exp $ */
+ /* $Id: afsdb_18.c,v 1.4 1999/02/22 07:23:59 marka Exp $ */
/* RFC 1183 */
@@ -108,6 +108,11 @@ towire_afsdb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 18);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
isc_buffer_available(target, &tr);
dns_rdata_toregion(rdata, &sr);
if (tr.length < 2)
diff --git a/lib/dns/rdata/generic/afsdb_18.h b/lib/dns/rdata/generic/afsdb_18.h
index afaf0c53f8..d8f778f438 100644
--- a/lib/dns/rdata/generic/afsdb_18.h
+++ b/lib/dns/rdata/generic/afsdb_18.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: afsdb_18.h,v 1.3 1999/02/16 22:42:23 marka Exp $ */
+ /* $Id: afsdb_18.h,v 1.4 1999/02/22 07:23:59 marka Exp $ */
/* RFC 1183 */
@@ -108,6 +108,11 @@ towire_afsdb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 18);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
isc_buffer_available(target, &tr);
dns_rdata_toregion(rdata, &sr);
if (tr.length < 2)
diff --git a/lib/dns/rdata/generic/cname_5.c b/lib/dns/rdata/generic/cname_5.c
index 174b29889b..3ba4d9c70d 100644
--- a/lib/dns/rdata/generic/cname_5.c
+++ b/lib/dns/rdata/generic/cname_5.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: cname_5.c,v 1.9 1999/02/16 22:51:17 marka Exp $ */
+ /* $Id: cname_5.c,v 1.10 1999/02/22 07:23:59 marka Exp $ */
#ifndef RDATA_GENERIC_CNAME_5_H
#define RDATA_GENERIC_CNAME_5_H
@@ -84,6 +84,11 @@ towire_cname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 5);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/cname_5.h b/lib/dns/rdata/generic/cname_5.h
index 8dff940d4d..d0325099f3 100644
--- a/lib/dns/rdata/generic/cname_5.h
+++ b/lib/dns/rdata/generic/cname_5.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: cname_5.h,v 1.9 1999/02/16 22:51:17 marka Exp $ */
+ /* $Id: cname_5.h,v 1.10 1999/02/22 07:23:59 marka Exp $ */
#ifndef RDATA_GENERIC_CNAME_5_H
#define RDATA_GENERIC_CNAME_5_H
@@ -84,6 +84,11 @@ towire_cname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 5);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/dname_39.c b/lib/dns/rdata/generic/dname_39.c
index 1e8c3a13ea..db1fccbb42 100644
--- a/lib/dns/rdata/generic/dname_39.c
+++ b/lib/dns/rdata/generic/dname_39.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: dname_39.c,v 1.2 1999/02/15 05:44:16 marka Exp $ */
+ /* $Id: dname_39.c,v 1.3 1999/02/22 07:24:00 marka Exp $ */
/* draft-ietf-dnsind-dname-02.txt */
@@ -84,6 +84,11 @@ towire_dname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 39);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/dname_39.h b/lib/dns/rdata/generic/dname_39.h
index 3433400166..a7dac412d5 100644
--- a/lib/dns/rdata/generic/dname_39.h
+++ b/lib/dns/rdata/generic/dname_39.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: dname_39.h,v 1.2 1999/02/15 05:44:16 marka Exp $ */
+ /* $Id: dname_39.h,v 1.3 1999/02/22 07:24:00 marka Exp $ */
/* draft-ietf-dnsind-dname-02.txt */
@@ -84,6 +84,11 @@ towire_dname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 39);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mb_7.c b/lib/dns/rdata/generic/mb_7.c
index 352c9b8d1f..dbe4a2fae8 100644
--- a/lib/dns/rdata/generic/mb_7.c
+++ b/lib/dns/rdata/generic/mb_7.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mb_7.c,v 1.9 1999/02/16 22:51:18 marka Exp $ */
+ /* $Id: mb_7.c,v 1.10 1999/02/22 07:24:00 marka Exp $ */
#ifndef RDATA_GENERIC_MB_7_H
#define RDATA_GENERIC_MB_7_H
@@ -84,6 +84,11 @@ towire_mb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 7);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mb_7.h b/lib/dns/rdata/generic/mb_7.h
index acf09bc5bd..6fdb08589c 100644
--- a/lib/dns/rdata/generic/mb_7.h
+++ b/lib/dns/rdata/generic/mb_7.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mb_7.h,v 1.9 1999/02/16 22:51:18 marka Exp $ */
+ /* $Id: mb_7.h,v 1.10 1999/02/22 07:24:00 marka Exp $ */
#ifndef RDATA_GENERIC_MB_7_H
#define RDATA_GENERIC_MB_7_H
@@ -84,6 +84,11 @@ towire_mb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 7);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/md_3.c b/lib/dns/rdata/generic/md_3.c
index b15b3ffc93..3a7c983670 100644
--- a/lib/dns/rdata/generic/md_3.c
+++ b/lib/dns/rdata/generic/md_3.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: md_3.c,v 1.9 1999/02/16 22:51:18 marka Exp $ */
+ /* $Id: md_3.c,v 1.10 1999/02/22 07:24:00 marka Exp $ */
#ifndef RDATA_GENERIC_MD_3_H
#define RDATA_GENERIC_MD_3_H
@@ -82,6 +82,11 @@ towire_md(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 3);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/md_3.h b/lib/dns/rdata/generic/md_3.h
index 2d652e11cf..1992bfb375 100644
--- a/lib/dns/rdata/generic/md_3.h
+++ b/lib/dns/rdata/generic/md_3.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: md_3.h,v 1.9 1999/02/16 22:51:18 marka Exp $ */
+ /* $Id: md_3.h,v 1.10 1999/02/22 07:24:00 marka Exp $ */
#ifndef RDATA_GENERIC_MD_3_H
#define RDATA_GENERIC_MD_3_H
@@ -82,6 +82,11 @@ towire_md(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 3);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mf_4.c b/lib/dns/rdata/generic/mf_4.c
index ff25680004..82f256a609 100644
--- a/lib/dns/rdata/generic/mf_4.c
+++ b/lib/dns/rdata/generic/mf_4.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mf_4.c,v 1.8 1999/02/16 22:42:26 marka Exp $ */
+ /* $Id: mf_4.c,v 1.9 1999/02/22 07:24:00 marka Exp $ */
#ifndef RDATA_GENERIC_MF_4_H
#define RDATA_GENERIC_MF_4_H
@@ -82,6 +82,11 @@ towire_mf(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 4);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mf_4.h b/lib/dns/rdata/generic/mf_4.h
index c13f16b654..7aa95d296f 100644
--- a/lib/dns/rdata/generic/mf_4.h
+++ b/lib/dns/rdata/generic/mf_4.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mf_4.h,v 1.8 1999/02/16 22:42:26 marka Exp $ */
+ /* $Id: mf_4.h,v 1.9 1999/02/22 07:24:00 marka Exp $ */
#ifndef RDATA_GENERIC_MF_4_H
#define RDATA_GENERIC_MF_4_H
@@ -82,6 +82,11 @@ towire_mf(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 4);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mg_8.c b/lib/dns/rdata/generic/mg_8.c
index c015120602..43b417a31a 100644
--- a/lib/dns/rdata/generic/mg_8.c
+++ b/lib/dns/rdata/generic/mg_8.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mg_8.c,v 1.8 1999/02/16 22:42:27 marka Exp $ */
+ /* $Id: mg_8.c,v 1.9 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MG_8_H
#define RDATA_GENERIC_MG_8_H
@@ -84,6 +84,11 @@ towire_mg(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 8);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mg_8.h b/lib/dns/rdata/generic/mg_8.h
index 418d0ac801..6bf85b1b2f 100644
--- a/lib/dns/rdata/generic/mg_8.h
+++ b/lib/dns/rdata/generic/mg_8.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mg_8.h,v 1.8 1999/02/16 22:42:27 marka Exp $ */
+ /* $Id: mg_8.h,v 1.9 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MG_8_H
#define RDATA_GENERIC_MG_8_H
@@ -84,6 +84,11 @@ towire_mg(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 8);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/minfo_14.c b/lib/dns/rdata/generic/minfo_14.c
index 2ac7a03ab7..4e878e9e7d 100644
--- a/lib/dns/rdata/generic/minfo_14.c
+++ b/lib/dns/rdata/generic/minfo_14.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: minfo_14.c,v 1.9 1999/02/16 22:42:27 marka Exp $ */
+ /* $Id: minfo_14.c,v 1.10 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MINFO_14_H
#define RDATA_GENERIC_MINFO_14_H
@@ -106,6 +106,11 @@ towire_minfo(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 14);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&rmail, NULL);
dns_name_init(&email, NULL);
diff --git a/lib/dns/rdata/generic/minfo_14.h b/lib/dns/rdata/generic/minfo_14.h
index b5b1a81197..244a333f99 100644
--- a/lib/dns/rdata/generic/minfo_14.h
+++ b/lib/dns/rdata/generic/minfo_14.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: minfo_14.h,v 1.9 1999/02/16 22:42:27 marka Exp $ */
+ /* $Id: minfo_14.h,v 1.10 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MINFO_14_H
#define RDATA_GENERIC_MINFO_14_H
@@ -106,6 +106,11 @@ towire_minfo(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 14);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&rmail, NULL);
dns_name_init(&email, NULL);
diff --git a/lib/dns/rdata/generic/mr_9.c b/lib/dns/rdata/generic/mr_9.c
index 65a4f3b0c1..f2e28b2302 100644
--- a/lib/dns/rdata/generic/mr_9.c
+++ b/lib/dns/rdata/generic/mr_9.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mr_9.c,v 1.8 1999/02/16 22:42:27 marka Exp $ */
+ /* $Id: mr_9.c,v 1.9 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MR_9_H
#define RDATA_GENERIC_MR_9_H
@@ -84,6 +84,11 @@ towire_mr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 9);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mr_9.h b/lib/dns/rdata/generic/mr_9.h
index 18ebb1ab20..19a7acf24e 100644
--- a/lib/dns/rdata/generic/mr_9.h
+++ b/lib/dns/rdata/generic/mr_9.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mr_9.h,v 1.8 1999/02/16 22:42:27 marka Exp $ */
+ /* $Id: mr_9.h,v 1.9 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MR_9_H
#define RDATA_GENERIC_MR_9_H
@@ -84,6 +84,11 @@ towire_mr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 9);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/mx_15.c b/lib/dns/rdata/generic/mx_15.c
index 18184c3048..49a440640c 100644
--- a/lib/dns/rdata/generic/mx_15.c
+++ b/lib/dns/rdata/generic/mx_15.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mx_15.c,v 1.11 1999/02/16 22:42:28 marka Exp $ */
+ /* $Id: mx_15.c,v 1.12 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MX_15_H
#define RDATA_GENERIC_MX_15_H
@@ -105,6 +105,11 @@ towire_mx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 15);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
isc_buffer_available(target, &tr);
dns_rdata_toregion(rdata, ®ion);
if (tr.length < 2)
diff --git a/lib/dns/rdata/generic/mx_15.h b/lib/dns/rdata/generic/mx_15.h
index 59e6eb76f0..dc93db7fd4 100644
--- a/lib/dns/rdata/generic/mx_15.h
+++ b/lib/dns/rdata/generic/mx_15.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: mx_15.h,v 1.11 1999/02/16 22:42:28 marka Exp $ */
+ /* $Id: mx_15.h,v 1.12 1999/02/22 07:24:01 marka Exp $ */
#ifndef RDATA_GENERIC_MX_15_H
#define RDATA_GENERIC_MX_15_H
@@ -105,6 +105,11 @@ towire_mx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 15);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
isc_buffer_available(target, &tr);
dns_rdata_toregion(rdata, ®ion);
if (tr.length < 2)
diff --git a/lib/dns/rdata/generic/ns_2.c b/lib/dns/rdata/generic/ns_2.c
index 74b49e3f64..4fc123e019 100644
--- a/lib/dns/rdata/generic/ns_2.c
+++ b/lib/dns/rdata/generic/ns_2.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: ns_2.c,v 1.8 1999/02/16 22:42:28 marka Exp $ */
+ /* $Id: ns_2.c,v 1.9 1999/02/22 07:24:02 marka Exp $ */
#ifndef RDATA_GENERIC_NS_2_H
#define RDATA_GENERIC_NS_2_H
@@ -84,6 +84,11 @@ towire_ns(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 2);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/ns_2.h b/lib/dns/rdata/generic/ns_2.h
index 7a22b60ace..71edd2ea2e 100644
--- a/lib/dns/rdata/generic/ns_2.h
+++ b/lib/dns/rdata/generic/ns_2.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: ns_2.h,v 1.8 1999/02/16 22:42:28 marka Exp $ */
+ /* $Id: ns_2.h,v 1.9 1999/02/22 07:24:02 marka Exp $ */
#ifndef RDATA_GENERIC_NS_2_H
#define RDATA_GENERIC_NS_2_H
@@ -84,6 +84,11 @@ towire_ns(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 2);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/nxt_30.c b/lib/dns/rdata/generic/nxt_30.c
index 7c64504ab4..ee55a3e680 100644
--- a/lib/dns/rdata/generic/nxt_30.c
+++ b/lib/dns/rdata/generic/nxt_30.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: nxt_30.c,v 1.5 1999/02/16 22:42:28 marka Exp $ */
+ /* $Id: nxt_30.c,v 1.6 1999/02/22 07:24:02 marka Exp $ */
/* RFC 2065 */
@@ -146,6 +146,11 @@ towire_nxt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 30);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, &sr);
dns_name_fromregion(&name, &sr);
diff --git a/lib/dns/rdata/generic/nxt_30.h b/lib/dns/rdata/generic/nxt_30.h
index f96e2d69af..0c5842938c 100644
--- a/lib/dns/rdata/generic/nxt_30.h
+++ b/lib/dns/rdata/generic/nxt_30.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: nxt_30.h,v 1.5 1999/02/16 22:42:28 marka Exp $ */
+ /* $Id: nxt_30.h,v 1.6 1999/02/22 07:24:02 marka Exp $ */
/* RFC 2065 */
@@ -146,6 +146,11 @@ towire_nxt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 30);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, &sr);
dns_name_fromregion(&name, &sr);
diff --git a/lib/dns/rdata/generic/proforma.c b/lib/dns/rdata/generic/proforma.c
index 83d55012b5..930b553ddd 100644
--- a/lib/dns/rdata/generic/proforma.c
+++ b/lib/dns/rdata/generic/proforma.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: proforma.c,v 1.6 1999/02/16 22:51:19 marka Exp $ */
+ /* $Id: proforma.c,v 1.7 1999/02/22 07:24:02 marka Exp $ */
#ifndef RDATA_GENERIC_#_#_H
#define RDATA_GENERIC_#_#_H
@@ -60,6 +60,11 @@ towire_#(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == #);
REQUIRE(rdata->class == #);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL):
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_LOCAL);
+
return (DNS_R_NOTIMPLEMENTED);
}
diff --git a/lib/dns/rdata/generic/proforma.h b/lib/dns/rdata/generic/proforma.h
index 9f787a5137..ad4449ba56 100644
--- a/lib/dns/rdata/generic/proforma.h
+++ b/lib/dns/rdata/generic/proforma.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: proforma.h,v 1.6 1999/02/16 22:51:19 marka Exp $ */
+ /* $Id: proforma.h,v 1.7 1999/02/22 07:24:02 marka Exp $ */
#ifndef RDATA_GENERIC_#_#_H
#define RDATA_GENERIC_#_#_H
@@ -60,6 +60,11 @@ towire_#(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == #);
REQUIRE(rdata->class == #);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL):
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_LOCAL);
+
return (DNS_R_NOTIMPLEMENTED);
}
diff --git a/lib/dns/rdata/generic/ptr_12.c b/lib/dns/rdata/generic/ptr_12.c
index 3548d58f03..d772476c03 100644
--- a/lib/dns/rdata/generic/ptr_12.c
+++ b/lib/dns/rdata/generic/ptr_12.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: ptr_12.c,v 1.9 1999/02/16 22:51:19 marka Exp $ */
+ /* $Id: ptr_12.c,v 1.10 1999/02/22 07:24:02 marka Exp $ */
#ifndef RDATA_GENERIC_PTR_12_H
#define RDATA_GENERIC_PTR_12_H
@@ -84,6 +84,11 @@ towire_ptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 12);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/ptr_12.h b/lib/dns/rdata/generic/ptr_12.h
index a373ea87ee..164c88c7a8 100644
--- a/lib/dns/rdata/generic/ptr_12.h
+++ b/lib/dns/rdata/generic/ptr_12.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: ptr_12.h,v 1.9 1999/02/16 22:51:19 marka Exp $ */
+ /* $Id: ptr_12.h,v 1.10 1999/02/22 07:24:02 marka Exp $ */
#ifndef RDATA_GENERIC_PTR_12_H
#define RDATA_GENERIC_PTR_12_H
@@ -84,6 +84,11 @@ towire_ptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 12);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/generic/rp_17.c b/lib/dns/rdata/generic/rp_17.c
index 21361376ce..651d1b95e2 100644
--- a/lib/dns/rdata/generic/rp_17.c
+++ b/lib/dns/rdata/generic/rp_17.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: rp_17.c,v 1.3 1999/02/16 22:42:29 marka Exp $ */
+ /* $Id: rp_17.c,v 1.4 1999/02/22 07:24:03 marka Exp $ */
/* RFC 1183 */
@@ -108,6 +108,11 @@ towire_rp(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 17);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&rmail, NULL);
dns_name_init(&email, NULL);
diff --git a/lib/dns/rdata/generic/rp_17.h b/lib/dns/rdata/generic/rp_17.h
index 42b2b1fa5a..3d470a42c4 100644
--- a/lib/dns/rdata/generic/rp_17.h
+++ b/lib/dns/rdata/generic/rp_17.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: rp_17.h,v 1.3 1999/02/16 22:42:29 marka Exp $ */
+ /* $Id: rp_17.h,v 1.4 1999/02/22 07:24:03 marka Exp $ */
/* RFC 1183 */
@@ -108,6 +108,11 @@ towire_rp(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 17);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&rmail, NULL);
dns_name_init(&email, NULL);
diff --git a/lib/dns/rdata/generic/rt_21.c b/lib/dns/rdata/generic/rt_21.c
index 7a0900d53a..a462a87b68 100644
--- a/lib/dns/rdata/generic/rt_21.c
+++ b/lib/dns/rdata/generic/rt_21.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: rt_21.c,v 1.3 1999/02/16 22:42:29 marka Exp $ */
+ /* $Id: rt_21.c,v 1.4 1999/02/22 07:24:03 marka Exp $ */
/* RFC 1183 */
@@ -107,6 +107,11 @@ towire_rt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 21);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
isc_buffer_available(target, &tr);
dns_rdata_toregion(rdata, ®ion);
if (tr.length < 2)
diff --git a/lib/dns/rdata/generic/rt_21.h b/lib/dns/rdata/generic/rt_21.h
index cbc1ae95bd..099a18d985 100644
--- a/lib/dns/rdata/generic/rt_21.h
+++ b/lib/dns/rdata/generic/rt_21.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: rt_21.h,v 1.3 1999/02/16 22:42:29 marka Exp $ */
+ /* $Id: rt_21.h,v 1.4 1999/02/22 07:24:03 marka Exp $ */
/* RFC 1183 */
@@ -107,6 +107,11 @@ towire_rt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 21);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
isc_buffer_available(target, &tr);
dns_rdata_toregion(rdata, ®ion);
if (tr.length < 2)
diff --git a/lib/dns/rdata/generic/sig_24.c b/lib/dns/rdata/generic/sig_24.c
index 45165cf4b4..3f3b3eebfb 100644
--- a/lib/dns/rdata/generic/sig_24.c
+++ b/lib/dns/rdata/generic/sig_24.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: sig_24.c,v 1.7 1999/02/16 22:42:29 marka Exp $ */
+ /* $Id: sig_24.c,v 1.8 1999/02/22 07:24:03 marka Exp $ */
/* RFC 2065 */
@@ -216,6 +216,11 @@ towire_sig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 24);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_rdata_toregion(rdata, &sr);
/*
* type covered: 2
diff --git a/lib/dns/rdata/generic/sig_24.h b/lib/dns/rdata/generic/sig_24.h
index 25e429569b..09323e3b0f 100644
--- a/lib/dns/rdata/generic/sig_24.h
+++ b/lib/dns/rdata/generic/sig_24.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: sig_24.h,v 1.7 1999/02/16 22:42:29 marka Exp $ */
+ /* $Id: sig_24.h,v 1.8 1999/02/22 07:24:03 marka Exp $ */
/* RFC 2065 */
@@ -216,6 +216,11 @@ towire_sig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 24);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_rdata_toregion(rdata, &sr);
/*
* type covered: 2
diff --git a/lib/dns/rdata/generic/soa_6.c b/lib/dns/rdata/generic/soa_6.c
index 640722ce35..84ceedbad6 100644
--- a/lib/dns/rdata/generic/soa_6.c
+++ b/lib/dns/rdata/generic/soa_6.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: soa_6.c,v 1.12 1999/02/16 22:51:19 marka Exp $ */
+ /* $Id: soa_6.c,v 1.13 1999/02/22 07:24:04 marka Exp $ */
#ifndef RDATA_GENERIC_SOA_6_H
#define RDATA_GENERIC_SOA_6_H
@@ -142,6 +142,11 @@ towire_soa(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 6);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&mname, NULL);
dns_name_init(&rname, NULL);
diff --git a/lib/dns/rdata/generic/soa_6.h b/lib/dns/rdata/generic/soa_6.h
index e8a418af93..4f6287b94e 100644
--- a/lib/dns/rdata/generic/soa_6.h
+++ b/lib/dns/rdata/generic/soa_6.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: soa_6.h,v 1.12 1999/02/16 22:51:19 marka Exp $ */
+ /* $Id: soa_6.h,v 1.13 1999/02/22 07:24:04 marka Exp $ */
#ifndef RDATA_GENERIC_SOA_6_H
#define RDATA_GENERIC_SOA_6_H
@@ -142,6 +142,11 @@ towire_soa(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 6);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+
dns_name_init(&mname, NULL);
dns_name_init(&rname, NULL);
diff --git a/lib/dns/rdata/generic/tkey_249.c b/lib/dns/rdata/generic/tkey_249.c
index cf10a9b2fb..f56ae9f7fd 100644
--- a/lib/dns/rdata/generic/tkey_249.c
+++ b/lib/dns/rdata/generic/tkey_249.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: tkey_249.c,v 1.5 1999/02/15 05:44:20 marka Exp $ */
+ /* $Id: tkey_249.c,v 1.6 1999/02/22 07:24:04 marka Exp $ */
/* draft-ietf-dnssec-tkey-01.txt */
@@ -224,6 +224,11 @@ towire_tkey(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 249);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* Algorithm */
dns_rdata_toregion(rdata, &sr);
dns_name_init(&name, NULL);
diff --git a/lib/dns/rdata/generic/tkey_249.h b/lib/dns/rdata/generic/tkey_249.h
index c95231ae07..be591e2a74 100644
--- a/lib/dns/rdata/generic/tkey_249.h
+++ b/lib/dns/rdata/generic/tkey_249.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: tkey_249.h,v 1.5 1999/02/15 05:44:20 marka Exp $ */
+ /* $Id: tkey_249.h,v 1.6 1999/02/22 07:24:04 marka Exp $ */
/* draft-ietf-dnssec-tkey-01.txt */
@@ -224,6 +224,11 @@ towire_tkey(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 249);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* Algorithm */
dns_rdata_toregion(rdata, &sr);
dns_name_init(&name, NULL);
diff --git a/lib/dns/rdata/in_1/a6_38.c b/lib/dns/rdata/in_1/a6_38.c
index 2386cef295..6a7a7f6f46 100644
--- a/lib/dns/rdata/in_1/a6_38.c
+++ b/lib/dns/rdata/in_1/a6_38.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: a6_38.c,v 1.5 1999/02/16 22:42:31 marka Exp $ */
+ /* $Id: a6_38.c,v 1.6 1999/02/22 07:24:04 marka Exp $ */
/* draft-ietf-ipngwg-dns-lookups-03.txt */
@@ -188,6 +188,11 @@ towire_in_a6(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 38);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_rdata_toregion(rdata, &sr);
prefixlen = sr.base[0];
INSIST(prefixlen <= 128);
diff --git a/lib/dns/rdata/in_1/a6_38.h b/lib/dns/rdata/in_1/a6_38.h
index c9a2be37bd..2b7ef2df93 100644
--- a/lib/dns/rdata/in_1/a6_38.h
+++ b/lib/dns/rdata/in_1/a6_38.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: a6_38.h,v 1.5 1999/02/16 22:42:31 marka Exp $ */
+ /* $Id: a6_38.h,v 1.6 1999/02/22 07:24:04 marka Exp $ */
/* draft-ietf-ipngwg-dns-lookups-03.txt */
@@ -188,6 +188,11 @@ towire_in_a6(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 38);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_rdata_toregion(rdata, &sr);
prefixlen = sr.base[0];
INSIST(prefixlen <= 128);
diff --git a/lib/dns/rdata/in_1/kx_36.c b/lib/dns/rdata/in_1/kx_36.c
index 64e7de70bf..2ed40b820a 100644
--- a/lib/dns/rdata/in_1/kx_36.c
+++ b/lib/dns/rdata/in_1/kx_36.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: kx_36.c,v 1.3 1999/02/16 22:42:32 marka Exp $ */
+ /* $Id: kx_36.c,v 1.4 1999/02/22 07:24:04 marka Exp $ */
/* RFC 2230 */
@@ -101,6 +101,11 @@ towire_in_kx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 36);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_rdata_toregion(rdata, ®ion);
RETERR(mem_tobuffer(target, region.base, 2));
isc_region_consume(®ion, 2);
diff --git a/lib/dns/rdata/in_1/kx_36.h b/lib/dns/rdata/in_1/kx_36.h
index 06aa79b883..caed89be18 100644
--- a/lib/dns/rdata/in_1/kx_36.h
+++ b/lib/dns/rdata/in_1/kx_36.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: kx_36.h,v 1.3 1999/02/16 22:42:32 marka Exp $ */
+ /* $Id: kx_36.h,v 1.4 1999/02/22 07:24:04 marka Exp $ */
/* RFC 2230 */
@@ -101,6 +101,11 @@ towire_in_kx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 36);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_rdata_toregion(rdata, ®ion);
RETERR(mem_tobuffer(target, region.base, 2));
isc_region_consume(®ion, 2);
diff --git a/lib/dns/rdata/in_1/naptr_35.c b/lib/dns/rdata/in_1/naptr_35.c
index 77c977e2ff..38f6717536 100644
--- a/lib/dns/rdata/in_1/naptr_35.c
+++ b/lib/dns/rdata/in_1/naptr_35.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: naptr_35.c,v 1.3 1999/02/16 22:42:32 marka Exp $ */
+ /* $Id: naptr_35.c,v 1.4 1999/02/22 07:24:05 marka Exp $ */
/* RFC 2168 */
@@ -152,6 +152,11 @@ towire_in_naptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target)
REQUIRE(rdata->type == 35);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* priority, weight */
dns_rdata_toregion(rdata, &sr);
RETERR(mem_tobuffer(target, sr.base, 4));
diff --git a/lib/dns/rdata/in_1/naptr_35.h b/lib/dns/rdata/in_1/naptr_35.h
index c2fd677db7..764cea4c63 100644
--- a/lib/dns/rdata/in_1/naptr_35.h
+++ b/lib/dns/rdata/in_1/naptr_35.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: naptr_35.h,v 1.3 1999/02/16 22:42:32 marka Exp $ */
+ /* $Id: naptr_35.h,v 1.4 1999/02/22 07:24:05 marka Exp $ */
/* RFC 2168 */
@@ -152,6 +152,11 @@ towire_in_naptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target)
REQUIRE(rdata->type == 35);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* priority, weight */
dns_rdata_toregion(rdata, &sr);
RETERR(mem_tobuffer(target, sr.base, 4));
diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.c b/lib/dns/rdata/in_1/nsap-ptr_23.c
index 2b9044411f..b286fbbb73 100644
--- a/lib/dns/rdata/in_1/nsap-ptr_23.c
+++ b/lib/dns/rdata/in_1/nsap-ptr_23.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: nsap-ptr_23.c,v 1.2 1999/02/15 05:44:21 marka Exp $ */
+ /* $Id: nsap-ptr_23.c,v 1.3 1999/02/22 07:24:05 marka Exp $ */
/* RFC 1348 */
@@ -90,6 +90,11 @@ towire_in_nsap_ptr(dns_rdata_t *rdata, dns_compress_t *cctx,
REQUIRE(rdata->type == 23);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.h b/lib/dns/rdata/in_1/nsap-ptr_23.h
index 9fb71bea96..a3a7ae36ee 100644
--- a/lib/dns/rdata/in_1/nsap-ptr_23.h
+++ b/lib/dns/rdata/in_1/nsap-ptr_23.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: nsap-ptr_23.h,v 1.2 1999/02/15 05:44:21 marka Exp $ */
+ /* $Id: nsap-ptr_23.h,v 1.3 1999/02/22 07:24:05 marka Exp $ */
/* RFC 1348 */
@@ -90,6 +90,11 @@ towire_in_nsap_ptr(dns_rdata_t *rdata, dns_compress_t *cctx,
REQUIRE(rdata->type == 23);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
dns_name_init(&name, NULL);
dns_rdata_toregion(rdata, ®ion);
dns_name_fromregion(&name, ®ion);
diff --git a/lib/dns/rdata/in_1/px_26.c b/lib/dns/rdata/in_1/px_26.c
index 523baf4557..7c0f8042e8 100644
--- a/lib/dns/rdata/in_1/px_26.c
+++ b/lib/dns/rdata/in_1/px_26.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: px_26.c,v 1.2 1999/02/15 05:44:22 marka Exp $ */
+ /* $Id: px_26.c,v 1.3 1999/02/22 07:24:05 marka Exp $ */
/* RFC 2163 */
@@ -126,6 +126,11 @@ towire_in_px(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 26);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* preference */
dns_rdata_toregion(rdata, ®ion);
RETERR(mem_tobuffer(target, region.base, 2));
diff --git a/lib/dns/rdata/in_1/px_26.h b/lib/dns/rdata/in_1/px_26.h
index e2227edf19..eeb0f11143 100644
--- a/lib/dns/rdata/in_1/px_26.h
+++ b/lib/dns/rdata/in_1/px_26.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: px_26.h,v 1.2 1999/02/15 05:44:22 marka Exp $ */
+ /* $Id: px_26.h,v 1.3 1999/02/22 07:24:05 marka Exp $ */
/* RFC 2163 */
@@ -126,6 +126,11 @@ towire_in_px(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 26);
REQUIRE(rdata->class == 1);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* preference */
dns_rdata_toregion(rdata, ®ion);
RETERR(mem_tobuffer(target, region.base, 2));
diff --git a/lib/dns/rdata/in_1/srv_33.c b/lib/dns/rdata/in_1/srv_33.c
index 75d8f5c117..4a53f55734 100644
--- a/lib/dns/rdata/in_1/srv_33.c
+++ b/lib/dns/rdata/in_1/srv_33.c
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: srv_33.c,v 1.2 1999/02/15 05:44:22 marka Exp $ */
+ /* $Id: srv_33.c,v 1.3 1999/02/22 07:24:05 marka Exp $ */
/* RFC 2052 bis */
@@ -129,6 +129,11 @@ towire_in_srv(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 33);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* priority, weight, port */
dns_rdata_toregion(rdata, &sr);
RETERR(mem_tobuffer(target, sr.base, 6));
diff --git a/lib/dns/rdata/in_1/srv_33.h b/lib/dns/rdata/in_1/srv_33.h
index fc48f1b9e7..d73fdea28e 100644
--- a/lib/dns/rdata/in_1/srv_33.h
+++ b/lib/dns/rdata/in_1/srv_33.h
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
- /* $Id: srv_33.h,v 1.2 1999/02/15 05:44:22 marka Exp $ */
+ /* $Id: srv_33.h,v 1.3 1999/02/22 07:24:05 marka Exp $ */
/* RFC 2052 bis */
@@ -129,6 +129,11 @@ towire_in_srv(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) {
REQUIRE(rdata->type == 33);
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
+
/* priority, weight, port */
dns_rdata_toregion(rdata, &sr);
RETERR(mem_tobuffer(target, sr.base, 6));
diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c
index cd81755353..2eb681be10 100644
--- a/lib/dns/rdataset.c
+++ b/lib/dns/rdataset.c
@@ -26,6 +26,7 @@
#include
#include
#include
+#include
void
dns_rdataset_init(dns_rdataset_t *rdataset) {
@@ -272,6 +273,8 @@ dns_rdataset_towire(dns_rdataset_t *rdataset,
isc_region_t r;
dns_result_t result;
unsigned int count;
+ isc_buffer_t st;
+ isc_buffer_t rdlen;
/*
* Convert 'rdataset' to wire format, compressing names as specified
@@ -288,31 +291,54 @@ dns_rdataset_towire(dns_rdataset_t *rdataset,
/*
* copy out the name, type, class, ttl.
*/
+ if (dns_compress_getedns(cctx) >= 1)
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL);
+ else
+ dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
+ st = *target;
result = dns_name_towire(owner_name, cctx, target);
- if (result != DNS_R_SUCCESS)
+ if (result != DNS_R_SUCCESS) {
+ dns_compress_backout(cctx, st.used);
+ *target = st;
return (result);
+ }
isc_buffer_available(target, &r);
if (r.length < (sizeof(dns_rdataclass_t)
+ sizeof(dns_rdatatype_t)
+ sizeof(dns_ttl_t)
- + 2)) /* XXX 2? it's for the rdata length */
+ + 2)) { /* XXX 2? it's for the rdata length */
+ dns_compress_backout(cctx, st.used);
+ *target = st;
return (DNS_R_NOSPACE);
+ }
isc_buffer_putuint16(target, rdataset->type);
isc_buffer_putuint16(target, rdataset->class);
isc_buffer_putuint32(target, rdataset->ttl);
/*
- * copy out the rdata length
+ * Save space for rdlen.
*/
- dns_rdataset_current(rdataset, &rdata);
- isc_buffer_putuint16(target, rdata.length);
+ rdlen = *target;
+ isc_buffer_add(target, 2);
/*
* copy out the rdata
*/
- result = dns_rdata_towire(&rdata, cctx, target);
- if (result != DNS_R_SUCCESS)
+ dns_rdataset_current(rdataset, &rdata);
+ result = dns_compress_localinit(cctx, owner_name, target);
+ if (result != DNS_R_SUCCESS) {
+ dns_compress_backout(cctx, st.used);
+ *target = st;
return (result);
+ }
+ result = dns_rdata_towire(&rdata, cctx, target);
+ dns_compress_localinvalidate(cctx);
+ if (result != DNS_R_SUCCESS) {
+ dns_compress_backout(cctx, st.used);
+ *target = st;
+ return (result);
+ }
+ isc_buffer_putuint16(&rdlen, target->used - rdlen.used - 2);
count++;