summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2014-07-30 18:27:56 +0200
committerKarolin Seeger <kseeger@samba.org>2014-09-08 07:49:10 +0200
commitec0df9f71e6cf1d7836f87bd27e40cebed04dc24 (patch)
tree118ff5f9f62e538236c000ed2d5d6b615c78332b /source4
parent256349ddfea8f16eaabf92a311ae247abeff5869 (diff)
downloadsamba-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.c2
-rw-r--r--source4/dns_server/dns_utils.c70
-rw-r--r--source4/dns_server/dnsserver_common.c78
-rw-r--r--source4/dns_server/dnsserver_common.h8
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__ */