s4:dns_server: split out dns_common_replace()
authorStefan Metzmacher <metze@samba.org>
Wed, 30 Jul 2014 16:27:56 +0000 (18:27 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 26 Aug 2014 07:13:06 +0000 (09:13 +0200)
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/dns_server/dns_update.c
source4/dns_server/dns_utils.c
source4/dns_server/dnsserver_common.c
source4/dns_server/dnsserver_common.h

index c439d8d27baad023c1f64549f1f2868e879d0ca9..a589d63bc06cf7dce94c8138d644f741aa7dd249 100644 (file)
@@ -312,8 +312,6 @@ static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx,
        r->wType = rrec->rr_type;
        r->dwTtlSeconds = rrec->ttl;
        r->rank = DNS_RANK_ZONE;
-       /* TODO: Autogenerate this somehow */
-       r->dwSerial = 110;
 
        /* If we get QCLASS_ANY, we're done here */
        if (rrec->rr_class == DNS_QCLASS_ANY) {
index cf1adccf83d441b0f27c5ec6d81c9f6d48e50add..c3a27fea5bbe400d096e047294a3049ab2a1382e 100644 (file)
@@ -164,72 +164,10 @@ WERROR dns_replace_records(struct dns_server *dns,
                           struct dnsp_DnssrvRpcRecord *records,
                           uint16_t rec_count)
 {
-       struct ldb_message_element *el;
-       uint16_t i;
-       int ret;
-       struct ldb_message *msg = NULL;
-
-       msg = ldb_msg_new(mem_ctx);
-       W_ERROR_HAVE_NO_MEMORY(msg);
-
-       msg->dn = dn;
-
-       ret = ldb_msg_add_empty(msg, "dnsRecord", LDB_FLAG_MOD_REPLACE, &el);
-       if (ret != LDB_SUCCESS) {
-               return DNS_ERR(SERVER_FAILURE);
-       }
-
-       el->values = talloc_zero_array(el, struct ldb_val, rec_count);
-       if (rec_count > 0) {
-               W_ERROR_HAVE_NO_MEMORY(el->values);
-       }
-
-       for (i = 0; i < rec_count; i++) {
-               static const struct dnsp_DnssrvRpcRecord zero;
-               struct ldb_val *v = &el->values[el->num_values];
-               enum ndr_err_code ndr_err;
-
-               if (memcmp(&records[i], &zero, sizeof(zero)) == 0) {
-                       continue;
-               }
-               ndr_err = ndr_push_struct_blob(v, el->values, &records[i],
-                               (ndr_push_flags_fn_t)ndr_push_dnsp_DnssrvRpcRecord);
-               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-                       DEBUG(0, ("Failed to grab dnsp_DnssrvRpcRecord\n"));
-                       return DNS_ERR(SERVER_FAILURE);
-               }
-               el->num_values++;
-       }
-
-
-       if (el->num_values == 0) {
-               if (needs_add) {
-                       return WERR_OK;
-               }
-               /* TODO: Delete object? */
-               el->flags = LDB_FLAG_MOD_DELETE;
-       }
-
-       if (needs_add) {
-               ret = ldb_msg_add_string(msg, "objectClass", "dnsNode");
-               if (ret != LDB_SUCCESS) {
-                       return DNS_ERR(SERVER_FAILURE);
-               }
-
-               ret = ldb_add(dns->samdb, msg);
-               if (ret != LDB_SUCCESS) {
-                       return DNS_ERR(SERVER_FAILURE);
-               }
-
-               return WERR_OK;
-       }
-
-       ret = ldb_modify(dns->samdb, msg);
-       if (ret != LDB_SUCCESS) {
-               return DNS_ERR(SERVER_FAILURE);
-       }
-
-       return WERR_OK;
+       /* TODO: Autogenerate this somehow */
+       uint32_t dwSerial = 110;
+       return dns_common_replace(dns->samdb, mem_ctx, dn,
+                                 needs_add, dwSerial, records, rec_count);
 }
 
 bool dns_authorative_for_zone(struct dns_server *dns,
index c1d08b231767d0ba418a88189aa0237732364057..3a777e5c1ebd503b34bac708536679de5e9f96dd 100644 (file)
@@ -144,3 +144,81 @@ WERROR dns_common_lookup(struct ldb_context *samdb,
 
        return WERR_OK;
 }
+
+WERROR dns_common_replace(struct ldb_context *samdb,
+                         TALLOC_CTX *mem_ctx,
+                         struct ldb_dn *dn,
+                         bool needs_add,
+                         uint32_t serial,
+                         struct dnsp_DnssrvRpcRecord *records,
+                         uint16_t rec_count)
+{
+       struct ldb_message_element *el;
+       uint16_t i;
+       int ret;
+       struct ldb_message *msg = NULL;
+
+       msg = ldb_msg_new(mem_ctx);
+       W_ERROR_HAVE_NO_MEMORY(msg);
+
+       msg->dn = dn;
+
+       ret = ldb_msg_add_empty(msg, "dnsRecord", LDB_FLAG_MOD_REPLACE, &el);
+       if (ret != LDB_SUCCESS) {
+               return DNS_ERR(SERVER_FAILURE);
+       }
+
+       el->values = talloc_zero_array(el, struct ldb_val, rec_count);
+       if (rec_count > 0) {
+               W_ERROR_HAVE_NO_MEMORY(el->values);
+       }
+
+       for (i = 0; i < rec_count; i++) {
+               static const struct dnsp_DnssrvRpcRecord zero;
+               struct ldb_val *v = &el->values[el->num_values];
+               enum ndr_err_code ndr_err;
+
+               if (memcmp(&records[i], &zero, sizeof(zero)) == 0) {
+                       continue;
+               }
+
+               records[i].dwSerial = serial;
+               ndr_err = ndr_push_struct_blob(v, el->values, &records[i],
+                               (ndr_push_flags_fn_t)ndr_push_dnsp_DnssrvRpcRecord);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       DEBUG(0, ("Failed to push dnsp_DnssrvRpcRecord\n"));
+                       return DNS_ERR(SERVER_FAILURE);
+               }
+               el->num_values++;
+       }
+
+       if (needs_add) {
+               if (el->num_values == 0) {
+                       return WERR_OK;
+               }
+
+               ret = ldb_msg_add_string(msg, "objectClass", "dnsNode");
+               if (ret != LDB_SUCCESS) {
+                       return DNS_ERR(SERVER_FAILURE);
+               }
+
+               ret = ldb_add(samdb, msg);
+               if (ret != LDB_SUCCESS) {
+                       return DNS_ERR(SERVER_FAILURE);
+               }
+
+               return WERR_OK;
+       }
+
+       if (el->num_values == 0) {
+               el->flags = LDB_FLAG_MOD_DELETE;
+       }
+
+       ret = ldb_modify(samdb, msg);
+       if (ret != LDB_SUCCESS) {
+               NTSTATUS nt = dsdb_ldb_err_to_ntstatus(ret);
+               return ntstatus_to_werror(nt);
+       }
+
+       return WERR_OK;
+}
index 4731780eea65da25e8e3477e6fc7971b8316e90d..1117ad119102a1195558e7be5800f59b3ceadd3e 100644 (file)
@@ -38,4 +38,12 @@ WERROR dns_common_lookup(struct ldb_context *samdb,
                         struct dnsp_DnssrvRpcRecord **records,
                         uint16_t *num_records);
 
+WERROR dns_common_replace(struct ldb_context *samdb,
+                         TALLOC_CTX *mem_ctx,
+                         struct ldb_dn *dn,
+                         bool needs_add,
+                         uint32_t serial,
+                         struct dnsp_DnssrvRpcRecord *records,
+                         uint16_t rec_count);
+
 #endif /* __DNSSERVER_COMMON_H__ */