diff options
author | Stefan Metzmacher <metze@samba.org> | 2014-07-30 18:27:56 +0200 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2014-09-08 07:49:10 +0200 |
commit | ec0df9f71e6cf1d7836f87bd27e40cebed04dc24 (patch) | |
tree | 118ff5f9f62e538236c000ed2d5d6b615c78332b /source4 | |
parent | 256349ddfea8f16eaabf92a311ae247abeff5869 (diff) | |
download | samba-ec0df9f71e6cf1d7836f87bd27e40cebed04dc24.tar.gz |
s4:dns_server: split out dns_common_replace()
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>
(cherry picked from commit 0689e795e073008d2ad539c0ef5ddbdc6d9efdac)
Diffstat (limited to 'source4')
-rw-r--r-- | source4/dns_server/dns_update.c | 2 | ||||
-rw-r--r-- | source4/dns_server/dns_utils.c | 70 | ||||
-rw-r--r-- | source4/dns_server/dnsserver_common.c | 78 | ||||
-rw-r--r-- | source4/dns_server/dnsserver_common.h | 8 |
4 files changed, 90 insertions, 68 deletions
diff --git a/source4/dns_server/dns_update.c b/source4/dns_server/dns_update.c index c439d8d27ba..a589d63bc06 100644 --- a/source4/dns_server/dns_update.c +++ b/source4/dns_server/dns_update.c @@ -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) { diff --git a/source4/dns_server/dns_utils.c b/source4/dns_server/dns_utils.c index cf1adccf83d..c3a27fea5bb 100644 --- a/source4/dns_server/dns_utils.c +++ b/source4/dns_server/dns_utils.c @@ -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, diff --git a/source4/dns_server/dnsserver_common.c b/source4/dns_server/dnsserver_common.c index c1d08b23176..3a777e5c1eb 100644 --- a/source4/dns_server/dnsserver_common.c +++ b/source4/dns_server/dnsserver_common.c @@ -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; +} diff --git a/source4/dns_server/dnsserver_common.h b/source4/dns_server/dnsserver_common.h index 4731780eea6..1117ad11910 100644 --- a/source4/dns_server/dnsserver_common.h +++ b/source4/dns_server/dnsserver_common.h @@ -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__ */ |