s4 dns: Implement dns record comparison function
authorKai Blin <kai@samba.org>
Fri, 16 Dec 2011 08:24:18 +0000 (09:24 +0100)
committerKai Blin <kai@samba.org>
Sat, 17 Dec 2011 01:46:08 +0000 (02:46 +0100)
source4/dns_server/dns_server.h
source4/dns_server/dns_utils.c

index 0339fff01fadc096eee16ce638ae1d124372639e..7387641c63101d7b86cf8125f63811136e6dd3cd 100644 (file)
@@ -23,6 +23,7 @@
 #define __DNS_SERVER_H__
 
 #include "librpc/gen_ndr/dns.h"
+#include "librpc/gen_ndr/ndr_dnsp.h"
 
 struct tsocket_address;
 
@@ -56,6 +57,8 @@ WERROR dns_server_process_update(struct dns_server *dns,
 uint8_t werr_to_dns_err(WERROR werror);
 bool dns_name_match(const char *zone, const char *name, size_t *host_part_len);
 bool dns_name_equal(const char *name1, const char *name2);
+bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1,
+                      struct dnsp_DnssrvRpcRecord *rec2);
 WERROR dns_name2dn(struct dns_server *dns,
                   TALLOC_CTX *mem_ctx,
                   const char *name,
index f179546849973b177abf73f7f404e8eaa56971f5..5da32c0c532bdf6ef703698102cc3a02ee419326 100644 (file)
@@ -109,6 +109,60 @@ bool dns_name_equal(const char *name1, const char *name2)
        return ret && (host_part_len == 0);
 }
 
+/*
+  see if two dns records match
+ */
+bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1,
+                      struct dnsp_DnssrvRpcRecord *rec2)
+{
+       if (rec1->wType != rec2->wType) {
+               return false;
+       }
+
+       /* see if the data matches */
+       switch (rec1->wType) {
+       case DNS_TYPE_A:
+               return strcmp(rec1->data.ipv4, rec2->data.ipv4) == 0;
+       case DNS_TYPE_AAAA:
+               return strcmp(rec1->data.ipv6, rec2->data.ipv6) == 0;
+       case DNS_TYPE_CNAME:
+               return dns_name_equal(rec1->data.cname, rec2->data.cname);
+       case DNS_TYPE_TXT:
+               return strcmp(rec1->data.txt, rec2->data.txt) == 0;
+       case DNS_TYPE_PTR:
+               return strcmp(rec1->data.ptr, rec2->data.ptr) == 0;
+       case DNS_TYPE_NS:
+               return dns_name_equal(rec1->data.ns, rec2->data.ns);
+
+       case DNS_TYPE_SRV:
+               return rec1->data.srv.wPriority == rec2->data.srv.wPriority &&
+                       rec1->data.srv.wWeight  == rec2->data.srv.wWeight &&
+                       rec1->data.srv.wPort    == rec2->data.srv.wPort &&
+                       dns_name_equal(rec1->data.srv.nameTarget, rec2->data.srv.nameTarget);
+
+       case DNS_TYPE_MX:
+               return rec1->data.mx.wPriority == rec2->data.mx.wPriority &&
+                       dns_name_equal(rec1->data.mx.nameTarget, rec2->data.mx.nameTarget);
+
+       case DNS_TYPE_HINFO:
+               return strcmp(rec1->data.hinfo.cpu, rec2->data.hinfo.cpu) == 0 &&
+                       strcmp(rec1->data.hinfo.os, rec2->data.hinfo.os) == 0;
+
+       case DNS_TYPE_SOA:
+               return dns_name_equal(rec1->data.soa.mname, rec2->data.soa.mname) &&
+                       dns_name_equal(rec1->data.soa.rname, rec2->data.soa.rname) &&
+                       rec1->data.soa.serial == rec2->data.soa.serial &&
+                       rec1->data.soa.refresh == rec2->data.soa.refresh &&
+                       rec1->data.soa.retry == rec2->data.soa.retry &&
+                       rec1->data.soa.expire == rec2->data.soa.expire &&
+                       rec1->data.soa.minimum == rec2->data.soa.minimum;
+       default:
+               break;
+       }
+
+       return false;
+}
+
 WERROR dns_name2dn(struct dns_server *dns,
                   TALLOC_CTX *mem_ctx,
                   const char *name,