summaryrefslogtreecommitdiff
path: root/source4/dns_server/dns_utils.c
diff options
context:
space:
mode:
authorKai Blin <kai@samba.org>2011-12-16 14:21:52 +0100
committerKai Blin <kai@samba.org>2011-12-17 02:46:08 +0100
commitd8a499a27b1cc19189be7cf51f01888389346950 (patch)
tree862eb52996b628dc3edc60a3536dfe2318c0cc66 /source4/dns_server/dns_utils.c
parentc191ad7e130c637faef23e7cec9d37c097da5a8b (diff)
downloadsamba-d8a499a27b1cc19189be7cf51f01888389346950.tar.gz
samba-d8a499a27b1cc19189be7cf51f01888389346950.tar.bz2
samba-d8a499a27b1cc19189be7cf51f01888389346950.zip
s4 dns: Actually handle the update request
Diffstat (limited to 'source4/dns_server/dns_utils.c')
-rw-r--r--source4/dns_server/dns_utils.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/source4/dns_server/dns_utils.c b/source4/dns_server/dns_utils.c
index c0e7ff7583..4649e5ffca 100644
--- a/source4/dns_server/dns_utils.c
+++ b/source4/dns_server/dns_utils.c
@@ -209,6 +209,80 @@ WERROR dns_lookup_records(struct dns_server *dns,
return WERR_OK;
}
+WERROR dns_replace_records(struct dns_server *dns,
+ TALLOC_CTX *mem_ctx,
+ struct ldb_dn *dn,
+ bool needs_add,
+ const 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? */
+ }
+
+ 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;
+}
+
WERROR dns_name2dn(struct dns_server *dns,
TALLOC_CTX *mem_ctx,
const char *name,