]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3056. [func] Added support for URI resource record. [RT #23386]
authorMark Andrews <marka@isc.org>
Fri, 26 Apr 2013 03:36:00 +0000 (13:36 +1000)
committerMark Andrews <marka@isc.org>
Fri, 26 Apr 2013 03:36:00 +0000 (13:36 +1000)
CHANGES
bin/tests/named.conf
bin/tests/rdata_test.c
bin/tests/system/genzone.sh
bin/tests/system/xfer/dig1.good
bin/tests/system/xfer/dig2.good
lib/dns/rdata.c
util/copyrights

diff --git a/CHANGES b/CHANGES
index a0c8124f55941fb9fd129e11cfcb4160c6a867bb..0b86c0b10ba5f5808c46f71e89c441a4f2489b5d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -16,6 +16,8 @@
 3547.  [bug]           Some malformed unknown rdata records were not properly
                        detected and rejected. [RT #33129]
 
+3056.  [func]          Added support for URI resource record. [RT #23386]
+
        --- 9.6-ESV-R9rc1 released ---
 
 3546.  [func]          Add EUI48 and EUI64 types. [RT #33082]
index 1f96981d117c082837ba78bb0806d8bb453cc62b..5766b3a7601cc40d5342603d7f6ed521de15204b 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.58 2007/06/19 23:46:59 tbox Exp $ */
+/* $Id: named.conf,v 1.59 2011/03/03 14:10:26 fdupont Exp $ */
 
 /*
  * This is a worthless, nonrunnable example of a named.conf file that has
@@ -394,7 +394,7 @@ zone "non-default-acl.demo.zone" {
                grant root.domain. name host.domain. a ns md mf cname soa mb mg
                        mr "null" wks ptr hinfo minfo mx txt rp afsdb x25
                        isdn rt nsap sig "key" px gpos aaaa loc nxt srv naptr kx
-                       cert a6 dname opt unspec tkey tsig ;
+                       cert a6 dname opt unspec uri tkey tsig ;
                grant foo.bar.com. self foo.bar.com. a;
        };
 };
index 00c117240c3be8a00d037bbb219a317ac492ccfd..4fb9eb143899db8b4ca28240348bafa6699fe171 100644 (file)
@@ -15,8 +15,6 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id$ */
-
 #include <config.h>
 
 #include <stdlib.h>
@@ -279,6 +277,11 @@ viastruct(dns_rdata_t *rdata, isc_mem_t *mctx,
                result = dns_rdata_tostruct(rdata, sp = &unspec, NULL);
                break;
        }
+       case dns_rdatatype_uri: {
+               dns_rdata_uri_t uri;
+               result = dns_rdata_tostruct(rdata, sp = &uri, NULL);
+               break;
+       }
        case dns_rdatatype_wks: {
                static dns_rdata_in_wks_t in_wks;
                result = dns_rdata_tostruct(rdata, sp = &in_wks, NULL);
@@ -541,6 +544,11 @@ viastruct(dns_rdata_t *rdata, isc_mem_t *mctx,
                result = dns_rdata_tostruct(rdata, sp = &unspec, mctx);
                break;
        }
+       case dns_rdatatype_uri: {
+               dns_rdata_uri_t uri;
+               result = dns_rdata_tostruct(rdata, sp = &uri, mctx);
+               break;
+       }
        case dns_rdatatype_wks: {
                static dns_rdata_in_wks_t in_wks;
                result = dns_rdata_tostruct(rdata, sp = &in_wks, mctx);
@@ -833,6 +841,11 @@ viastruct(dns_rdata_t *rdata, isc_mem_t *mctx,
                result = dns_rdata_fromstruct(rdata2, rdc, rdt, &unspec, b);
                break;
        }
+       case dns_rdatatype_uri: {
+               dns_rdata_uri_t uri;
+               result = dns_rdata_fromstruct(rdata2, rdc, rdt, &uri, b);
+               break;
+       }
        case dns_rdatatype_wks: {
                dns_rdata_in_wks_t in_wks;
                result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_wks, b);
index 81196ff55eeef2fb9d0886b0fa2afe4f643aa146..893dd4a52c049638a235e059ba5cb4e6599e057c 100644 (file)
@@ -15,8 +15,6 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id$
-
 #
 # Set up a test zone
 #
@@ -281,4 +279,9 @@ eui64                       EUI64   01-23-45-67-89-ab-cd-ef
 
 ; type 255
 ; TSIG is a meta-type and should never occur in master files.
+
+; type 256
+uri01                  URI     10 20 "https://www.isc.org/"
+uri02                  URI     30 40 "https://www.isc.org/HolyCowThisSureIsAVeryLongURIRecordIDontEvenKnowWhatSomeoneWouldEverWantWithSuchAThingButTheSpecificationRequiresThatWesupportItSoHereWeGoTestingItLaLaLaLaLaLaLaSeriouslyThoughWhyWouldYouEvenConsiderUsingAURIThisLongItSeemsLikeASillyIdeaButEnhWhatAreYouGonnaDo/"
+
 EOF
index 1b150530ba75e74f93cc908945469f2368ad4165..96b22a588d197da10d148c597f42ee8f544f09ca 100644 (file)
@@ -80,6 +80,8 @@ txt09.example.                3600    IN      TXT     "foo\010bar"
 txt10.example.         3600    IN      TXT     "foo bar"
 txt11.example.         3600    IN      TXT     "\"foo\""
 txt12.example.         3600    IN      TXT     "\"foo\""
+uri01.example.         3600    IN      URI     10 20 "https://www.isc.org/"
+uri02.example.         3600    IN      URI     30 40 "https://www.isc.org/HolyCowThisSureIsAVeryLongURIRecordIDontEvenKnowWhatSomeoneWouldEverWantWithSuchAThingButTheSpecificationRequiresThatWesupportItSoHereWeGoTestingItLaLaLaLaLaLaLaSeriouslyThoughWhyWouldYouEvenConsiderUsingAURIThisLongItSeemsLikeASillyIdeaButEnhWhatAreYouGonnaDo/"
 wks01.example.         3600    IN      WKS     10.0.0.1 6 0 1 2 21 23
 wks02.example.         3600    IN      WKS     10.0.0.1 17 0 1 2 53
 wks03.example.         3600    IN      WKS     10.0.0.2 6 65535
index 8426231300a993e1599e8ad0f9fc4dad79b3c565..ec9cd5d43e3d194f14dce2934553037b794aebae 100644 (file)
@@ -80,6 +80,8 @@ txt09.example.                3600    IN      TXT     "foo\010bar"
 txt10.example.         3600    IN      TXT     "foo bar"
 txt11.example.         3600    IN      TXT     "\"foo\""
 txt12.example.         3600    IN      TXT     "\"foo\""
+uri01.example.         3600    IN      URI     10 20 "https://www.isc.org/"
+uri02.example.         3600    IN      URI     30 40 "https://www.isc.org/HolyCowThisSureIsAVeryLongURIRecordIDontEvenKnowWhatSomeoneWouldEverWantWithSuchAThingButTheSpecificationRequiresThatWesupportItSoHereWeGoTestingItLaLaLaLaLaLaLaSeriouslyThoughWhyWouldYouEvenConsiderUsingAURIThisLongItSeemsLikeASillyIdeaButEnhWhatAreYouGonnaDo/"
 wks01.example.         3600    IN      WKS     10.0.0.1 6 0 1 2 21 23
 wks02.example.         3600    IN      WKS     10.0.0.1 17 0 1 2 53
 wks03.example.         3600    IN      WKS     10.0.0.2 6 65535
index 998a946b315ecd64cfa26d6850540214b66b1b24..55a5f7f8df843888479a9b7a6f95acdb00a91cf4 100644 (file)
@@ -15,8 +15,6 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id$ */
-
 /*! \file */
 
 #include <config.h>
@@ -123,6 +121,15 @@ txt_fromtext(isc_textregion_t *source, isc_buffer_t *target);
 static isc_result_t
 txt_fromwire(isc_buffer_t *source, isc_buffer_t *target);
 
+static isc_result_t
+multitxt_totext(isc_region_t *source, isc_buffer_t *target);
+
+static isc_result_t
+multitxt_fromtext(isc_textregion_t *source, isc_buffer_t *target);
+
+static isc_result_t
+multitxt_fromwire(isc_buffer_t *source, isc_buffer_t *target);
+
 static isc_boolean_t
 name_prefix(dns_name_t *name, dns_name_t *origin, dns_name_t *target);
 
@@ -1244,6 +1251,157 @@ txt_fromwire(isc_buffer_t *source, isc_buffer_t *target) {
        return (ISC_R_SUCCESS);
 }
 
+static isc_result_t
+multitxt_totext(isc_region_t *source, isc_buffer_t *target) {
+       unsigned int tl;
+       unsigned int n0, n;
+       unsigned char *sp;
+       char *tp;
+       isc_region_t region;
+
+       isc_buffer_availableregion(target, &region);
+       sp = source->base;
+       tp = (char *)region.base;
+       tl = region.length;
+
+       if (tl < 1)
+               return (ISC_R_NOSPACE);
+       *tp++ = '"';
+       tl--;
+       do {
+               n0 = n = *sp++;
+
+               REQUIRE(n0 + 1 <= source->length);
+
+               while (n--) {
+                       if (*sp < 0x20 || *sp >= 0x7f) {
+                               if (tl < 4)
+                                       return (ISC_R_NOSPACE);
+                               *tp++ = 0x5c;
+                               *tp++ = 0x30 + ((*sp / 100) % 10);
+                               *tp++ = 0x30 + ((*sp / 10) % 10);
+                               *tp++ = 0x30 + (*sp % 10);
+                               sp++;
+                               tl -= 4;
+                               continue;
+                       }
+                       /* double quote, semi-colon, backslash */
+                       if (*sp == 0x22 || *sp == 0x3b || *sp == 0x5c) {
+                               if (tl < 2)
+                                       return (ISC_R_NOSPACE);
+                               *tp++ = '\\';
+                               tl--;
+                       }
+                       if (tl < 1)
+                               return (ISC_R_NOSPACE);
+                       *tp++ = *sp++;
+                       tl--;
+               }
+               isc_region_consume(source, n0 + 1);
+       } while (source->length != 0);
+       if (tl < 1)
+               return (ISC_R_NOSPACE);
+       *tp++ = '"';
+       tl--;
+       isc_buffer_add(target, tp - (char *)region.base);
+       return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+multitxt_fromtext(isc_textregion_t *source, isc_buffer_t *target) {
+       isc_region_t tregion;
+       isc_boolean_t escape;
+       unsigned int n, nrem;
+       char *s;
+       unsigned char *t0, *t;
+       int d;
+       int c;
+
+       s = source->base;
+       n = source->length;
+       escape = ISC_FALSE;
+
+       do {
+               isc_buffer_availableregion(target, &tregion);
+               t0 = tregion.base;
+               nrem = tregion.length;
+               if (nrem < 1)
+                       return (ISC_R_NOSPACE);
+               /* length byte */
+               t = t0;
+               nrem--;
+               t++;
+               /* 255 byte character-string slice */
+               if (nrem > 255)
+                       nrem = 255;
+               while (n != 0) {
+                       --n;
+                       c = (*s++) & 0xff;
+                       if (escape && (d = decvalue((char)c)) != -1) {
+                               c = d;
+                               if (n == 0)
+                                       return (DNS_R_SYNTAX);
+                               n--;
+                               if ((d = decvalue(*s++)) != -1)
+                                       c = c * 10 + d;
+                               else
+                                       return (DNS_R_SYNTAX);
+                               if (n == 0)
+                                       return (DNS_R_SYNTAX);
+                               n--;
+                               if ((d = decvalue(*s++)) != -1)
+                                       c = c * 10 + d;
+                               else
+                                       return (DNS_R_SYNTAX);
+                               if (c > 255)
+                                       return (DNS_R_SYNTAX);
+                       } else if (!escape && c == '\\') {
+                               escape = ISC_TRUE;
+                               continue;
+                       }
+                       escape = ISC_FALSE;
+                       *t++ = c;
+                       nrem--;
+                       if (nrem == 0)
+                               break;
+               }
+               if (escape)
+                       return (DNS_R_SYNTAX);
+               *t0 = t - t0 - 1;
+               isc_buffer_add(target, *t0 + 1);
+       } while (n != 0);
+       return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+multitxt_fromwire(isc_buffer_t *source, isc_buffer_t *target) {
+       unsigned int n;
+       isc_region_t sregion;
+       isc_region_t tregion;
+
+       isc_buffer_activeregion(source, &sregion);
+       if (sregion.length == 0)
+               return(ISC_R_UNEXPECTEDEND);
+       n = 256U;
+       do {
+               if (n != 256U)
+                       return (DNS_R_SYNTAX);
+               n = *sregion.base + 1;
+               if (n > sregion.length)
+                       return (ISC_R_UNEXPECTEDEND);
+
+               isc_buffer_availableregion(target, &tregion);
+               if (n > tregion.length)
+                       return (ISC_R_NOSPACE);
+
+               memcpy(tregion.base, sregion.base, n);
+               isc_buffer_forward(source, n);
+               isc_buffer_add(target, n);
+               isc_buffer_activeregion(source, &sregion);
+       } while (sregion.length != 0);
+       return (ISC_R_SUCCESS);
+}
+
 static isc_boolean_t
 name_prefix(dns_name_t *name, dns_name_t *origin, dns_name_t *target) {
        int l1, l2;
index 4bff13d17cb43782c33a7c00edff9b1179972024..df4c38669e838b94c0f7bf4358d9344c5583b2f3 100644 (file)
@@ -1,3 +1,5 @@
+./lib/dns/rdata/generic/uri_256.c              C       2011,2012,2013
+./lib/dns/rdata/generic/uri_256.h              C       2011,2012,2013
 ./.gitignore                                   X       2012
 ./Atffile                                      X       2011
 ./CHANGES                                      X       2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013