]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1901. [func] Support for SPF rdata type. [RT #15033]
authorMark Andrews <marka@isc.org>
Thu, 14 Jul 2005 06:46:44 +0000 (06:46 +0000)
committerMark Andrews <marka@isc.org>
Thu, 14 Jul 2005 06:46:44 +0000 (06:46 +0000)
CHANGES
bin/tests/rdata_test.c
lib/dns/rdata/generic/spf_99.c [new file with mode: 0644]
lib/dns/rdata/generic/spf_99.h [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index 3c083a3626b8605a193902581cdc80127b5091d6..cf9cda899771d72fd278298bfac4a45d12ac3cb5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+1901.  [func]          Support for SPF rdata type. [RT #15033]
+
 1900.  [port]          freebsd: pthread_mutex_init can fail if it runs out
                        of memory. [RT #14995]
 
index 8c097078fc6793e3eadb0f72762f91337710d53c..37256dadde33df9e40de15721c9d48666e276059 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: rdata_test.c,v 1.43 2005/03/17 03:56:11 marka Exp $ */
+/* $Id: rdata_test.c,v 1.44 2005/07/14 06:46:44 marka Exp $ */
 
 #include <config.h>
 
@@ -269,6 +269,11 @@ viastruct(dns_rdata_t *rdata, isc_mem_t *mctx,
                result = dns_rdata_tostruct(rdata, sp = &txt, NULL);
                break;
        }
+       case dns_rdatatype_spf: {
+               dns_rdata_spf_t spf;
+               result = dns_rdata_tostruct(rdata, sp = &spf, NULL);
+               break;
+       }
        case dns_rdatatype_unspec: {
                dns_rdata_unspec_t unspec;
                result = dns_rdata_tostruct(rdata, sp = &unspec, NULL);
@@ -526,6 +531,11 @@ viastruct(dns_rdata_t *rdata, isc_mem_t *mctx,
                result = dns_rdata_tostruct(rdata, sp = &txt, mctx);
                break;
        }
+       case dns_rdatatype_spf: {
+               dns_rdata_spf_t spf;
+               result = dns_rdata_tostruct(rdata, sp = &spf, mctx);
+               break;
+       }
        case dns_rdatatype_unspec: {
                dns_rdata_unspec_t unspec;
                result = dns_rdata_tostruct(rdata, sp = &unspec, mctx);
@@ -813,6 +823,11 @@ viastruct(dns_rdata_t *rdata, isc_mem_t *mctx,
                result = dns_rdata_fromstruct(rdata2, rdc, rdt, &txt, b);
                break;
        }
+       case dns_rdatatype_spf: {
+               dns_rdata_spf_t spf;
+               result = dns_rdata_fromstruct(rdata2, rdc, rdt, &spf, b);
+               break;
+       }
        case dns_rdatatype_unspec: {
                dns_rdata_unspec_t unspec;
                result = dns_rdata_fromstruct(rdata2, rdc, rdt, &unspec, b);
diff --git a/lib/dns/rdata/generic/spf_99.c b/lib/dns/rdata/generic/spf_99.c
new file mode 100644 (file)
index 0000000..cc24fd3
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 1998-2002  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 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.
+ */
+
+/* $Id: spf_99.c,v 1.1 2005/07/14 06:46:44 marka Exp $ */
+
+/* Reviewed: Thu Mar 16 15:40:00 PST 2000 by bwelling */
+
+#ifndef RDATA_GENERIC_SPF_99_C
+#define RDATA_GENERIC_SPF_99_C
+
+#define RRTYPE_SPF_ATTRIBUTES (0)
+
+static inline isc_result_t
+fromtext_spf(ARGS_FROMTEXT) {
+       isc_token_t token;
+       int strings;
+
+       REQUIRE(type == 99);
+
+       UNUSED(type);
+       UNUSED(rdclass);
+       UNUSED(origin);
+       UNUSED(options);
+       UNUSED(callbacks);
+
+       strings = 0;
+       for (;;) {
+               RETERR(isc_lex_getmastertoken(lexer, &token,
+                                             isc_tokentype_qstring,
+                                             ISC_TRUE));
+               if (token.type != isc_tokentype_qstring &&
+                   token.type != isc_tokentype_string)
+                       break;
+               RETTOK(txt_fromtext(&token.value.as_textregion, target));
+               strings++;
+       }
+       /* Let upper layer handle eol/eof. */
+       isc_lex_ungettoken(lexer, &token);
+       return (strings == 0 ? ISC_R_UNEXPECTEDEND : ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+totext_spf(ARGS_TOTEXT) {
+       isc_region_t region;
+
+       UNUSED(tctx);
+
+       REQUIRE(rdata->type == 99);
+
+       dns_rdata_toregion(rdata, &region);
+
+       while (region.length > 0) {
+               RETERR(txt_totext(&region, target));
+               if (region.length > 0)
+                       RETERR(str_totext(" ", target));
+       }
+
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+fromwire_spf(ARGS_FROMWIRE) {
+       isc_result_t result;
+
+       REQUIRE(type == 99);
+
+       UNUSED(type);
+       UNUSED(dctx);
+       UNUSED(rdclass);
+       UNUSED(options);
+
+       do {
+               result = txt_fromwire(source, target);
+               if (result != ISC_R_SUCCESS)
+                       return (result);
+       } while (!buffer_empty(source));
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+towire_spf(ARGS_TOWIRE) {
+       isc_region_t region;
+
+       REQUIRE(rdata->type == 99);
+
+       UNUSED(cctx);
+
+       isc_buffer_availableregion(target, &region);
+       if (region.length < rdata->length)
+               return (ISC_R_NOSPACE);
+
+       memcpy(region.base, rdata->data, rdata->length);
+       isc_buffer_add(target, rdata->length);
+       return (ISC_R_SUCCESS);
+}
+
+static inline int
+compare_spf(ARGS_COMPARE) {
+       isc_region_t r1;
+       isc_region_t r2;
+
+       REQUIRE(rdata1->type == rdata2->type);
+       REQUIRE(rdata1->rdclass == rdata2->rdclass);
+       REQUIRE(rdata1->type == 99);
+
+       dns_rdata_toregion(rdata1, &r1);
+       dns_rdata_toregion(rdata2, &r2);
+       return (isc_region_compare(&r1, &r2));
+}
+
+static inline isc_result_t
+fromstruct_spf(ARGS_FROMSTRUCT) {
+       dns_rdata_spf_t *txt = source;
+       isc_region_t region;
+       isc_uint8_t length;
+
+       REQUIRE(type == 99);
+       REQUIRE(source != NULL);
+       REQUIRE(txt->common.rdtype == type);
+       REQUIRE(txt->common.rdclass == rdclass);
+       REQUIRE(txt->txt != NULL && txt->txt_len != 0);
+
+       UNUSED(type);
+       UNUSED(rdclass);
+
+       region.base = txt->txt;
+       region.length = txt->txt_len;
+       while (region.length > 0) {
+               length = uint8_fromregion(&region);
+               isc_region_consume(&region, 1);
+               if (region.length <= length)
+                       return (ISC_R_UNEXPECTEDEND);
+               isc_region_consume(&region, length);
+       }
+
+       return (mem_tobuffer(target, txt->txt, txt->txt_len));
+}
+
+static inline isc_result_t
+tostruct_spf(ARGS_TOSTRUCT) {
+       dns_rdata_spf_t *txt = target;
+       isc_region_t r;
+
+       REQUIRE(rdata->type == 99);
+       REQUIRE(target != NULL);
+
+       txt->common.rdclass = rdata->rdclass;
+       txt->common.rdtype = rdata->type;
+       ISC_LINK_INIT(&txt->common, link);
+
+       dns_rdata_toregion(rdata, &r);
+       txt->txt_len = r.length;
+       txt->txt = mem_maybedup(mctx, r.base, r.length);
+       if (txt->txt == NULL)
+               return (ISC_R_NOMEMORY);
+
+       txt->offset = 0;
+       txt->mctx = mctx;
+       return (ISC_R_SUCCESS);
+}
+
+static inline void
+freestruct_spf(ARGS_FREESTRUCT) {
+       dns_rdata_spf_t *txt = source;
+
+       REQUIRE(source != NULL);
+       REQUIRE(txt->common.rdtype == 99);
+
+       if (txt->mctx == NULL)
+               return;
+
+       if (txt->txt != NULL)
+               isc_mem_free(txt->mctx, txt->txt);
+       txt->mctx = NULL;
+}
+
+static inline isc_result_t
+additionaldata_spf(ARGS_ADDLDATA) {
+       REQUIRE(rdata->type == 99);
+
+       UNUSED(rdata);
+       UNUSED(add);
+       UNUSED(arg);
+
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+digest_spf(ARGS_DIGEST) {
+       isc_region_t r;
+
+       REQUIRE(rdata->type == 99);
+
+       dns_rdata_toregion(rdata, &r);
+
+       return ((digest)(arg, &r));
+}
+
+static inline isc_boolean_t
+checkowner_spf(ARGS_CHECKOWNER) {
+
+       REQUIRE(type == 99);
+
+       UNUSED(name);
+       UNUSED(type);
+       UNUSED(rdclass);
+       UNUSED(wildcard);
+
+       return (ISC_TRUE);
+}
+
+static inline isc_boolean_t
+checknames_spf(ARGS_CHECKNAMES) {
+
+       REQUIRE(rdata->type == 99);
+
+       UNUSED(rdata);
+       UNUSED(owner);
+       UNUSED(bad);
+
+       return (ISC_TRUE);
+}
+
+#endif /* RDATA_GENERIC_SPF_99_C */
diff --git a/lib/dns/rdata/generic/spf_99.h b/lib/dns/rdata/generic/spf_99.h
new file mode 100644 (file)
index 0000000..279eed1
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 1998-2001  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 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.
+ */
+
+#ifndef GENERIC_SPF_99_H
+#define GENERIC_SPF_99_H 1
+
+/* $Id: spf_99.h,v 1.1 2005/07/14 06:46:44 marka Exp $ */
+
+typedef struct dns_rdata_spf_string {
+                isc_uint8_t    length;
+                unsigned char   *data;
+} dns_rdata_spf_string_t;
+
+typedef struct dns_rdata_spf {
+        dns_rdatacommon_t       common;
+        isc_mem_t               *mctx;
+        unsigned char           *txt;
+        isc_uint16_t            txt_len;
+        /* private */
+        isc_uint16_t            offset;
+} dns_rdata_spf_t;
+
+/*
+ * ISC_LANG_BEGINDECLS and ISC_LANG_ENDDECLS are already done
+ * via rdatastructpre.h and rdatastructsuf.h.
+ */
+
+isc_result_t
+dns_rdata_spf_first(dns_rdata_spf_t *);
+
+isc_result_t
+dns_rdata_spf_next(dns_rdata_spf_t *);
+
+isc_result_t
+dns_rdata_spf_current(dns_rdata_spf_t *, dns_rdata_spf_string_t *);
+
+#endif /* GENERIC_SPF_99_H */