[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Wed Aug 27 07:22:04 MDT 2014
The branch, master has been updated
via d68a2eb s4:dlz_bind9: let dlz_bind9 use dns_common_lookup() before add/modify
via 11bbfd9 s4:dlz_bind9: let dlz_bind9 use dns_common_lookup() before removing records
via fd952bf s4:dlz_bind9: let dlz_bind9 use dns_common_replace()
via dedcf30 s4:dlz_bind9: let dlz_bind9 use dns_common_extract()
via 96dcebe s4:dlz_bind9: let dlz_bind9 use dns_common_lookup() for name lookup
via 914a366 torture-dns: Add test for dlz_bind9 updates
via e23621e torture-dns: Add test for dlz_bind9 zonedumps
via 2189470 torture-dns: Add test for dlz_bind9 lookups
via 76943bf s4:torture:dlz_bind9: fix spnego tests
from 4383ec5 s4:setup/dns_update_list: make use of the new substitution variables
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit d68a2ebecd244181b1238635ee54dadd05835525
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Jul 31 09:30:16 2014 +0200
s4:dlz_bind9: let dlz_bind9 use dns_common_lookup() before add/modify
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
Autobuild-Date(master): Wed Aug 27 15:21:19 CEST 2014 on sn-devel-104
commit 11bbfd932c113b3222bc93d59702271a3777b6f3
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Jul 30 20:12:08 2014 +0200
s4:dlz_bind9: let dlz_bind9 use dns_common_lookup() before removing records
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit fd952bf814835c4860ab10794225fbd583ee3ad5
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Jul 30 18:51:39 2014 +0200
s4:dlz_bind9: let dlz_bind9 use dns_common_replace()
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749
Change-Id: I2fd2503230cbf89445594e49f39ac321769ff06e
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit dedcf30fd12821c272002e3b4cbfda4ca38650fd
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Jul 30 17:59:08 2014 +0200
s4:dlz_bind9: let dlz_bind9 use dns_common_extract()
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749
Change-Id: I7c661964a3da1a1981f022a06b9bef25bbd33479
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 96dcebe8c20b9aa954a96a4deabe16957576be2c
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Jul 30 08:40:32 2014 +0200
s4:dlz_bind9: let dlz_bind9 use dns_common_lookup() for name lookup
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749
Change-Id: I2632fa0ce120a978f6f400fa5cbf18a7fbbd64a3
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 914a3667471ced3199f51db8bc1d4a6d3fbc4e8f
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Aug 26 12:04:59 2014 +0200
torture-dns: Add test for dlz_bind9 updates
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit e23621e9dab67c8997d24b2ac7e4fd181fc5907c
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Aug 26 10:34:17 2014 +0200
torture-dns: Add test for dlz_bind9 zonedumps
Change-Id: I074b3e4cdad1a0b69c085dcaa44d6f48e68e863b
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 2189470c2f55afe29e9e8dad1d2659a7eb2d06f9
Author: Andrew Bartlett <abartlet at samba.org>
Date: Tue Aug 26 10:24:27 2014 +1200
torture-dns: Add test for dlz_bind9 lookups
Change-Id: I3b9d1b56e3aa873fb8540b98e196b713b82332ca
Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
Signed-off-by: Andrew Bartlett <abartlet at samba.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 76943bf0ac259fb8855bd123fe4bc85a103ba418
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Aug 26 13:48:21 2014 +0200
s4:torture:dlz_bind9: fix spnego tests
The dlz_bind9 module uses the special dns-${NETBIOSNAME} account,
and this is only available under the dns/hostname.domain SPN, not
host/hostname.
Also the dlz_ssumatch() function returns isc_boolean_t instead
of isc_result_t. As ISC_R_SUCCESS and ISC_FALSE have the same value
we didn't notice this problem.
Change-Id: I48539c3f48f5dde9eaa2fff6da0f3be2f9f66311
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source4/dns_server/dlz_bind9.c | 369 ++++++-----------
source4/dns_server/wscript_build | 6 +-
source4/torture/dns/dlz_bind9.c | 861 +++++++++++++++++++++++++++++++++++++-
3 files changed, 982 insertions(+), 254 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source4/dns_server/dlz_bind9.c b/source4/dns_server/dlz_bind9.c
index 83b6070..f663a2c 100644
--- a/source4/dns_server/dlz_bind9.c
+++ b/source4/dns_server/dlz_bind9.c
@@ -38,7 +38,7 @@
#include "lib/cmdline/popt_common.h"
#include "lib/util/dlinklist.h"
#include "dlz_minimal.h"
-
+#include "dns_server/dnsserver_common.h"
struct b9_options {
const char *url;
@@ -808,11 +808,10 @@ static isc_result_t dlz_lookup_types(struct dlz_bind9_data *state,
const char **types)
{
TALLOC_CTX *tmp_ctx = talloc_new(state);
- const char *attrs[] = { "dnsRecord", NULL };
- int ret = LDB_SUCCESS, i;
- struct ldb_result *res;
- struct ldb_message_element *el;
struct ldb_dn *dn;
+ WERROR werr = WERR_DNS_ERROR_NAME_DOES_NOT_EXIST;
+ struct dnsp_DnssrvRpcRecord *records = NULL;
+ uint16_t num_records = 0, i;
for (i=0; zone_prefixes[i]; i++) {
dn = ldb_dn_copy(tmp_ctx, ldb_get_default_basedn(state->samdb));
@@ -826,38 +825,21 @@ static isc_result_t dlz_lookup_types(struct dlz_bind9_data *state,
return ISC_R_NOMEMORY;
}
- ret = ldb_search(state->samdb, tmp_ctx, &res, dn, LDB_SCOPE_BASE,
- attrs, "objectClass=dnsNode");
- if (ret == LDB_SUCCESS) {
+ werr = dns_common_lookup(state->samdb, tmp_ctx, dn,
+ &records, &num_records, NULL);
+ if (W_ERROR_IS_OK(werr)) {
break;
}
}
- if (ret != LDB_SUCCESS || res->count == 0) {
- talloc_free(tmp_ctx);
- return ISC_R_NOTFOUND;
- }
-
- el = ldb_msg_find_element(res->msgs[0], "dnsRecord");
- if (el == NULL || el->num_values == 0) {
+ if (!W_ERROR_IS_OK(werr)) {
talloc_free(tmp_ctx);
return ISC_R_NOTFOUND;
}
- for (i=0; i<el->num_values; i++) {
- struct dnsp_DnssrvRpcRecord rec;
- enum ndr_err_code ndr_err;
+ for (i=0; i < num_records; i++) {
isc_result_t result;
- ndr_err = ndr_pull_struct_blob(&el->values[i], tmp_ctx, &rec,
- (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- state->log(ISC_LOG_ERROR, "samba_dlz: failed to parse dnsRecord for %s",
- ldb_dn_get_linearized(dn));
- talloc_free(tmp_ctx);
- return ISC_R_FAILURE;
- }
-
- result = b9_putrr(state, lookup, &rec, types);
+ result = b9_putrr(state, lookup, &records[i], types);
if (result != ISC_R_SUCCESS) {
talloc_free(tmp_ctx);
return result;
@@ -936,6 +918,9 @@ _PUBLIC_ isc_result_t dlz_allnodes(const char *zone, void *dbdata,
TALLOC_CTX *el_ctx = talloc_new(tmp_ctx);
const char *rdn, *name;
const struct ldb_val *v;
+ WERROR werr;
+ struct dnsp_DnssrvRpcRecord *recs = NULL;
+ uint16_t num_recs = 0;
el = ldb_msg_find_element(res->msgs[i], "dnsRecord");
if (el == NULL || el->num_values == 0) {
@@ -969,20 +954,18 @@ _PUBLIC_ isc_result_t dlz_allnodes(const char *zone, void *dbdata,
return ISC_R_NOMEMORY;
}
- for (j=0; j<el->num_values; j++) {
- struct dnsp_DnssrvRpcRecord rec;
- enum ndr_err_code ndr_err;
- isc_result_t result;
+ werr = dns_common_extract(el, el_ctx, &recs, &num_recs);
+ if (!W_ERROR_IS_OK(werr)) {
+ state->log(ISC_LOG_ERROR, "samba_dlz: failed to parse dnsRecord for %s, %s",
+ ldb_dn_get_linearized(dn), win_errstr(werr));
+ talloc_free(el_ctx);
+ continue;
+ }
- ndr_err = ndr_pull_struct_blob(&el->values[j], el_ctx, &rec,
- (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- state->log(ISC_LOG_ERROR, "samba_dlz: failed to parse dnsRecord for %s",
- ldb_dn_get_linearized(dn));
- continue;
- }
+ for (j=0; j < num_recs; j++) {
+ isc_result_t result;
- result = b9_putnamedrr(state, allnodes, name, &rec);
+ result = b9_putnamedrr(state, allnodes, name, &recs[j]);
if (result != ISC_R_SUCCESS) {
continue;
}
@@ -1066,39 +1049,25 @@ _PUBLIC_ void dlz_closeversion(const char *zone, isc_boolean_t commit,
*/
static bool b9_has_soa(struct dlz_bind9_data *state, struct ldb_dn *dn, const char *zone)
{
- const char *attrs[] = { "dnsRecord", NULL };
- struct ldb_result *res;
- struct ldb_message_element *el;
TALLOC_CTX *tmp_ctx = talloc_new(state);
- int ret, i;
+ WERROR werr;
+ struct dnsp_DnssrvRpcRecord *records = NULL;
+ uint16_t num_records = 0, i;
if (!ldb_dn_add_child_fmt(dn, "DC=@,DC=%s", zone)) {
talloc_free(tmp_ctx);
return false;
}
- ret = ldb_search(state->samdb, tmp_ctx, &res, dn, LDB_SCOPE_BASE,
- attrs, "objectClass=dnsNode");
- if (ret != LDB_SUCCESS) {
- talloc_free(tmp_ctx);
- return false;
- }
-
- el = ldb_msg_find_element(res->msgs[0], "dnsRecord");
- if (el == NULL) {
+ werr = dns_common_lookup(state->samdb, tmp_ctx, dn,
+ &records, &num_records, NULL);
+ if (!W_ERROR_IS_OK(werr)) {
talloc_free(tmp_ctx);
return false;
}
- for (i=0; i<el->num_values; i++) {
- struct dnsp_DnssrvRpcRecord rec;
- enum ndr_err_code ndr_err;
- ndr_err = ndr_pull_struct_blob(&el->values[i], tmp_ctx, &rec,
- (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- continue;
- }
- if (rec.wType == DNS_TYPE_SOA) {
+ for (i=0; i < num_records; i++) {
+ if (records[i].wType == DNS_TYPE_SOA) {
talloc_free(tmp_ctx);
return true;
}
@@ -1378,46 +1347,6 @@ _PUBLIC_ isc_boolean_t dlz_ssumatch(const char *signer, const char *name, const
return ISC_TRUE;
}
-
-/*
- add a new record
- */
-static isc_result_t b9_add_record(struct dlz_bind9_data *state, const char *name,
- struct ldb_dn *dn,
- struct dnsp_DnssrvRpcRecord *rec)
-{
- struct ldb_message *msg;
- enum ndr_err_code ndr_err;
- struct ldb_val v;
- int ret;
-
- msg = ldb_msg_new(rec);
- if (msg == NULL) {
- return ISC_R_NOMEMORY;
- }
- msg->dn = dn;
- ret = ldb_msg_add_string(msg, "objectClass", "dnsNode");
- if (ret != LDB_SUCCESS) {
- return ISC_R_FAILURE;
- }
-
- ndr_err = ndr_push_struct_blob(&v, rec, rec, (ndr_push_flags_fn_t)ndr_push_dnsp_DnssrvRpcRecord);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- return ISC_R_FAILURE;
- }
- ret = ldb_msg_add_value(msg, "dnsRecord", &v, NULL);
- if (ret != LDB_SUCCESS) {
- return ISC_R_FAILURE;
- }
-
- ret = ldb_add(state->samdb, msg);
- if (ret != LDB_SUCCESS) {
- return ISC_R_FAILURE;
- }
-
- return ISC_R_SUCCESS;
-}
-
/*
see if two DNS names are the same
*/
@@ -1549,12 +1478,14 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
struct dnsp_DnssrvRpcRecord *rec;
struct ldb_dn *dn;
isc_result_t result;
- struct ldb_result *res;
- const char *attrs[] = { "dnsRecord", NULL };
- int ret, i;
- struct ldb_message_element *el;
- enum ndr_err_code ndr_err;
+ bool tombstoned = false;
+ bool needs_add = false;
+ struct dnsp_DnssrvRpcRecord *recs = NULL;
+ uint16_t num_recs = 0;
+ uint16_t first = 0;
+ uint16_t i;
NTTIME t;
+ WERROR werr;
if (state->transaction_token != (void*)version) {
state->log(ISC_LOG_INFO, "samba_dlz: bad transaction version");
@@ -1571,7 +1502,6 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
t /= 3600; /* convert to hours */
rec->rank = DNS_RANK_ZONE;
- rec->dwSerial = state->soa_serial;
rec->dwTimeStamp = (uint32_t)t;
if (!b9_parse(state, rdatastr, rec)) {
@@ -1588,70 +1518,55 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
}
/* get any existing records */
- ret = ldb_search(state->samdb, rec, &res, dn, LDB_SCOPE_BASE, attrs, "objectClass=dnsNode");
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- if (!b9_set_session_info(state, name)) {
- talloc_free(rec);
- return ISC_R_FAILURE;
- }
- result = b9_add_record(state, name, dn, rec);
- b9_reset_session_info(state);
+ werr = dns_common_lookup(state->samdb, rec, dn,
+ &recs, &num_recs, &tombstoned);
+ if (W_ERROR_EQUAL(werr, WERR_DNS_ERROR_NAME_DOES_NOT_EXIST)) {
+ needs_add = true;
+ werr = WERR_OK;
+ }
+ if (!W_ERROR_IS_OK(werr)) {
+ state->log(ISC_LOG_ERROR, "samba_dlz: failed to parse dnsRecord for %s, %s",
+ ldb_dn_get_linearized(dn), win_errstr(werr));
talloc_free(rec);
- if (result == ISC_R_SUCCESS) {
- state->log(ISC_LOG_INFO, "samba_dlz: added %s %s", name, rdatastr);
- }
- return result;
+ return ISC_R_FAILURE;
}
- el = ldb_msg_find_element(res->msgs[0], "dnsRecord");
- if (el == NULL) {
- ret = ldb_msg_add_empty(res->msgs[0], "dnsRecord", LDB_FLAG_MOD_ADD, &el);
- if (ret != LDB_SUCCESS) {
- state->log(ISC_LOG_ERROR, "samba_dlz: failed to add dnsRecord for %s",
- ldb_dn_get_linearized(dn));
- talloc_free(rec);
- return ISC_R_FAILURE;
- }
+ if (tombstoned) {
+ /*
+ * we need to keep the existing tombstone record
+ * and ignore it
+ */
+ first = num_recs;
}
/* there are existing records. We need to see if this will
* replace a record or add to it
*/
- for (i=0; i<el->num_values; i++) {
- struct dnsp_DnssrvRpcRecord rec2;
-
- ndr_err = ndr_pull_struct_blob(&el->values[i], rec, &rec2,
- (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- state->log(ISC_LOG_ERROR, "samba_dlz: failed to parse dnsRecord for %s",
- ldb_dn_get_linearized(dn));
- talloc_free(rec);
- return ISC_R_FAILURE;
- }
-
- if (b9_record_match(state, rec, &rec2)) {
+ for (i=first; i < num_recs; i++) {
+ if (b9_record_match(state, rec, &recs[i])) {
break;
}
}
- if (i == el->num_values) {
+ if (i == UINT16_MAX) {
+ state->log(ISC_LOG_ERROR, "samba_dlz: failed to already %u dnsRecord values for %s",
+ i, ldb_dn_get_linearized(dn));
+ talloc_free(rec);
+ return ISC_R_FAILURE;
+ }
+
+ if (i == num_recs) {
/* adding a new value */
- el->values = talloc_realloc(el, el->values, struct ldb_val, el->num_values+1);
- if (el->values == NULL) {
+ recs = talloc_realloc(rec, recs,
+ struct dnsp_DnssrvRpcRecord,
+ num_recs + 1);
+ if (recs == NULL) {
talloc_free(rec);
return ISC_R_NOMEMORY;
}
- el->num_values++;
- }
-
- ndr_err = ndr_push_struct_blob(&el->values[i], rec, rec,
- (ndr_push_flags_fn_t)ndr_push_dnsp_DnssrvRpcRecord);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- state->log(ISC_LOG_ERROR, "samba_dlz: failed to push dnsRecord for %s",
- ldb_dn_get_linearized(dn));
- talloc_free(rec);
- return ISC_R_FAILURE;
+ num_recs++;
}
+ recs[i] = *rec;
if (!b9_set_session_info(state, name)) {
talloc_free(rec);
@@ -1659,12 +1574,15 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
}
/* modify the record */
- el->flags = LDB_FLAG_MOD_REPLACE;
- ret = ldb_modify(state->samdb, res->msgs[0]);
+ werr = dns_common_replace(state->samdb, rec, dn,
+ needs_add,
+ state->soa_serial,
+ recs, num_recs);
b9_reset_session_info(state);
- if (ret != LDB_SUCCESS) {
- state->log(ISC_LOG_ERROR, "samba_dlz: failed to modify %s - %s",
- ldb_dn_get_linearized(dn), ldb_errstring(state->samdb));
+ if (!W_ERROR_IS_OK(werr)) {
+ state->log(ISC_LOG_ERROR, "samba_dlz: failed to %s %s - %s",
+ needs_add ? "add" : "modify",
+ ldb_dn_get_linearized(dn), win_errstr(werr));
talloc_free(rec);
return ISC_R_FAILURE;
}
@@ -1684,11 +1602,10 @@ _PUBLIC_ isc_result_t dlz_subrdataset(const char *name, const char *rdatastr, vo
struct dnsp_DnssrvRpcRecord *rec;
struct ldb_dn *dn;
isc_result_t result;
- struct ldb_result *res;
- const char *attrs[] = { "dnsRecord", NULL };
- int ret, i;
- struct ldb_message_element *el;
- enum ndr_err_code ndr_err;
+ struct dnsp_DnssrvRpcRecord *recs = NULL;
+ uint16_t num_recs = 0;
+ uint16_t i;
+ WERROR werr;
if (state->transaction_token != (void*)version) {
state->log(ISC_LOG_ERROR, "samba_dlz: bad transaction version");
@@ -1714,64 +1631,40 @@ _PUBLIC_ isc_result_t dlz_subrdataset(const char *name, const char *rdatastr, vo
}
/* get the existing records */
- ret = ldb_search(state->samdb, rec, &res, dn, LDB_SCOPE_BASE, attrs, "objectClass=dnsNode");
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
+ werr = dns_common_lookup(state->samdb, rec, dn,
+ &recs, &num_recs, NULL);
+ if (!W_ERROR_IS_OK(werr)) {
talloc_free(rec);
return ISC_R_NOTFOUND;
}
- /* there are existing records. We need to see if any match
- */
- el = ldb_msg_find_element(res->msgs[0], "dnsRecord");
- if (el == NULL || el->num_values == 0) {
- state->log(ISC_LOG_ERROR, "samba_dlz: no dnsRecord attribute for %s",
- ldb_dn_get_linearized(dn));
- talloc_free(rec);
- return ISC_R_FAILURE;
- }
-
- for (i=0; i<el->num_values; i++) {
- struct dnsp_DnssrvRpcRecord rec2;
-
- ndr_err = ndr_pull_struct_blob(&el->values[i], rec, &rec2,
- (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- state->log(ISC_LOG_ERROR, "samba_dlz: failed to parse dnsRecord for %s",
- ldb_dn_get_linearized(dn));
- talloc_free(rec);
- return ISC_R_FAILURE;
- }
-
- if (b9_record_match(state, rec, &rec2)) {
+ for (i=0; i < num_recs; i++) {
+ if (b9_record_match(state, rec, &recs[i])) {
+ recs[i] = (struct dnsp_DnssrvRpcRecord) {
+ .wType = DNS_TYPE_TOMBSTONE,
+ };
break;
}
}
- if (i == el->num_values) {
+ if (i == num_recs) {
talloc_free(rec);
return ISC_R_NOTFOUND;
}
- if (i < el->num_values-1) {
- memmove(&el->values[i], &el->values[i+1], sizeof(el->values[0])*((el->num_values-1)-i));
- }
- el->num_values--;
-
if (!b9_set_session_info(state, name)) {
talloc_free(rec);
return ISC_R_FAILURE;
}
- if (el->num_values == 0) {
- el->flags = LDB_FLAG_MOD_DELETE;
- } else {
- el->flags = LDB_FLAG_MOD_REPLACE;
- }
- ret = ldb_modify(state->samdb, res->msgs[0]);
-
+ /* modify the record */
+ werr = dns_common_replace(state->samdb, rec, dn,
+ false,/* needs_add */
+ state->soa_serial,
+ recs, num_recs);
b9_reset_session_info(state);
- if (ret != LDB_SUCCESS) {
+ if (!W_ERROR_IS_OK(werr)) {
state->log(ISC_LOG_ERROR, "samba_dlz: failed to modify %s - %s",
- ldb_dn_get_linearized(dn), ldb_errstring(state->samdb));
+ ldb_dn_get_linearized(dn), win_errstr(werr));
talloc_free(rec);
return ISC_R_FAILURE;
}
@@ -1792,13 +1685,12 @@ _PUBLIC_ isc_result_t dlz_delrdataset(const char *name, const char *type, void *
TALLOC_CTX *tmp_ctx;
struct ldb_dn *dn;
isc_result_t result;
- struct ldb_result *res;
- const char *attrs[] = { "dnsRecord", NULL };
- int ret, i;
- struct ldb_message_element *el;
- enum ndr_err_code ndr_err;
enum dns_record_type dns_type;
bool found = false;
+ struct dnsp_DnssrvRpcRecord *recs = NULL;
+ uint16_t num_recs = 0;
+ uint16_t ri = 0;
+ WERROR werr;
if (state->transaction_token != (void*)version) {
state->log(ISC_LOG_ERROR, "samba_dlz: bad transaction version");
@@ -1820,41 +1712,22 @@ _PUBLIC_ isc_result_t dlz_delrdataset(const char *name, const char *type, void *
}
/* get the existing records */
- ret = ldb_search(state->samdb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, attrs, "objectClass=dnsNode");
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- talloc_free(tmp_ctx);
- return ISC_R_NOTFOUND;
- }
-
- /* there are existing records. We need to see if any match the type
- */
- el = ldb_msg_find_element(res->msgs[0], "dnsRecord");
- if (el == NULL || el->num_values == 0) {
+ werr = dns_common_lookup(state->samdb, tmp_ctx, dn,
+ &recs, &num_recs, NULL);
+ if (!W_ERROR_IS_OK(werr)) {
talloc_free(tmp_ctx);
return ISC_R_NOTFOUND;
}
- for (i=0; i<el->num_values; i++) {
- struct dnsp_DnssrvRpcRecord rec2;
-
--
Samba Shared Repository
More information about the samba-cvs
mailing list