[SCM] Samba Shared Repository - branch master updated

Amitay Isaacs amitay at samba.org
Thu Mar 1 07:59:02 MST 2012


The branch, master has been updated
       via  f5f17b1 dlz_bind9: Match PTR records as DNS names and not just strings
       via  78446b4 s4-dns: Fix handling of TXT DNS Record
       via  e5409ad upgradedns: Fix import of TXT DNS records
       via  cf139b4 s4-rpc: dnsserver: Update data type for TXT DNS records
       via  0c77422 samba-tool: dns: Add support for handling TXT records
       via  f025d78 samba-tool: dns: Copy string data when creating DNS_RPC_RECORD
       via  bcaa278 provision: dns: TXT Records need a list of strings as input
       via  a0d6904 ndr: dnsserver: Add pull and push functions for DNS_RPC_RECORD_STRING
       via  e15fc28 idl: dnsserver: Add DNS_RPC_RECORD_STRING data type for TXT DNS record
       via  0c8a10e dlz_bind9: Fix handling of TXT records with multiple quoted strings
       via  7b8cd6f ndr: Add NDR pull, push, print functions for dnsp_string_list
       via  db79126 idl: dnsp: Add dnsp_string_list data type for TXT DNS record
       via  c467634 ndr: Fix NDR push function for dnsp_string
       via  ad1ef79 ndr: Fix the error messages, add correct data type name
       via  f5b041f dlz_bind9: This fixes the problem with adding/deleting rdataset
      from  9c11c0c s4-libnet: Remove set but unused variables

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f5f17b19af0ce46539f150c5dbf232a7f49bccc7
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Mar 2 00:23:00 2012 +1100

    dlz_bind9: Match PTR records as DNS names and not just strings
    
    This fixes the dynamic update of PTR records.
    
    Autobuild-User: Amitay Isaacs <amitay at samba.org>
    Autobuild-Date: Thu Mar  1 15:58:05 CET 2012 on sn-devel-104

commit 78446b42b7bed565dff75db73e8efcd3835808c0
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 17:01:27 2012 +1100

    s4-dns: Fix handling of TXT DNS Record

commit e5409ad0ca0517118c261fa924221fd18afaf66d
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 18:27:04 2012 +1100

    upgradedns: Fix import of TXT DNS records

commit cf139b4efcf13c12b20f63969c0744771a0d8e9a
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 16:35:39 2012 +1100

    s4-rpc: dnsserver: Update data type for TXT DNS records

commit 0c774220412c4b56c00d276ef4bfc50336a99284
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 15:14:49 2012 +1100

    samba-tool: dns: Add support for handling TXT records

commit f025d788d011403ef6740e777aef5ee289b35b0c
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 15:12:44 2012 +1100

    samba-tool: dns: Copy string data when creating DNS_RPC_RECORD

commit bcaa278e32a1fb334253638f24d6f23378c6119c
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 14:59:39 2012 +1100

    provision: dns: TXT Records need a list of strings as input

commit a0d6904ed30b7edd41715c0e8c8517e1486b38e4
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 14:57:23 2012 +1100

    ndr: dnsserver: Add pull and push functions for DNS_RPC_RECORD_STRING

commit e15fc28e6bdf4488940260c8a26459845283f617
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 14:56:37 2012 +1100

    idl: dnsserver: Add DNS_RPC_RECORD_STRING data type for TXT DNS record

commit 0c8a10ecb0f5eca08ca58f86c18aa1bae25d1353
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 14:14:07 2012 +1100

    dlz_bind9: Fix handling of TXT records with multiple quoted strings

commit 7b8cd6fcf39d047f10fe31be09f74bd1287975a7
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 15:07:10 2012 +1100

    ndr: Add NDR pull, push, print functions for dnsp_string_list

commit db791262888a91d906526c6503e774117c5292f6
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 15:06:12 2012 +1100

    idl: dnsp: Add dnsp_string_list data type for TXT DNS record

commit c46763419aac3165f0eafbbc786cc929129c5109
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 13:58:48 2012 +1100

    ndr: Fix NDR push function for dnsp_string
    
    Push the actual length of the string not including null-termination.

commit ad1ef7948668d17c03009fad10d2d3fd01cacb77
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 28 14:58:16 2012 +1100

    ndr: Fix the error messages, add correct data type name

commit f5b041fc04f158d0462995d592359fa6bd74b2ff
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Mon Feb 27 17:09:10 2012 +1100

    dlz_bind9: This fixes the problem with adding/deleting rdataset
    
    Fix commit 169db333033b72b6f9ac1e7b23f0f2c151218c1f. This change
    allowed for LDB records without dnsRecord attribute to exist to
    prevent large number of deleted records.
    
    This change fixes the handling of missing dnsRecord attribute
    and correctly deleting dnsRecord attribute.

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/dnsp.idl                                |    7 +-
 librpc/idl/dnsserver.idl                           |   10 ++-
 librpc/ndr/ndr_dnsp.c                              |   70 ++++++++++++--
 librpc/ndr/ndr_dnsserver.c                         |   37 +++++++
 source4/dns_server/dlz_bind9.c                     |   66 ++++++++++---
 source4/dns_server/dns_update.c                    |   11 ++-
 source4/dns_server/dns_utils.c                     |   13 +++-
 source4/rpc_server/dnsserver/dnsdata.c             |   31 +++++-
 source4/scripting/bin/samba_upgradedns             |    4 +-
 source4/scripting/python/samba/netcmd/dns.py       |   99 ++++++++++++++-----
 .../scripting/python/samba/provision/sambadns.py   |    7 +-
 11 files changed, 289 insertions(+), 66 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/dnsp.idl b/librpc/idl/dnsp.idl
index 258b3a2..4c49001 100644
--- a/librpc/idl/dnsp.idl
+++ b/librpc/idl/dnsp.idl
@@ -193,6 +193,11 @@ interface dnsp
 		dnsp_dns_addr AddrArray[AddrCount];
 	} dnsp_dns_addr_array;
 
+	typedef [public,nopull,nopush,noprint,gensize] struct {
+		uint8		count;
+		dnsp_string	str[count];
+	} dnsp_string_list;
+
 	typedef [nodiscriminant,gensize] union {
 		[case(DNS_TYPE_TOMBSTONE)] 		    NTTIME timestamp;
 		[case(DNS_TYPE_A)] [flag(NDR_BIG_ENDIAN)]   ipv4address ipv4;
@@ -200,7 +205,7 @@ interface dnsp
 		[case(DNS_TYPE_CNAME)]                      dnsp_name cname;
 		[case(DNS_TYPE_SOA)] [flag(NDR_BIG_ENDIAN)] dnsp_soa soa;
 		[case(DNS_TYPE_MX)] [flag(NDR_BIG_ENDIAN)]  dnsp_mx mx;
-		[case(DNS_TYPE_TXT)]                        dnsp_string txt;
+		[case(DNS_TYPE_TXT)]                        dnsp_string_list txt;
 		[case(DNS_TYPE_PTR)]                        dnsp_name ptr;
 		[case(DNS_TYPE_HINFO)]                      dnsp_hinfo hinfo;
 		[case(DNS_TYPE_AAAA)]                       ipv6address ipv6;
diff --git a/librpc/idl/dnsserver.idl b/librpc/idl/dnsserver.idl
index 5e29511..506d72e 100644
--- a/librpc/idl/dnsserver.idl
+++ b/librpc/idl/dnsserver.idl
@@ -71,7 +71,7 @@ import "misc.idl", "dnsp.idl";
 	/* DNS_RECORD_TYPE is defined in dnsp.idl as dns_record_type */
 	/* DNS_RPC_NODE_FLAGS is defined in dnsp.idl as dns_rpc_node_flags */
 
-	typedef [gensize] struct {
+	typedef [public,gensize] struct {
 		[value(strlen(str))] uint8 len;
 		[charset(UTF8)] uint8 str[len];
 	}
@@ -103,6 +103,12 @@ import "misc.idl", "dnsp.idl";
 	}
 	DNS_RPC_RECORD_NAME_PREFERENCE;
 
+	typedef [gensize,nopull,nopush] struct {
+		uint8 count;
+		DNS_RPC_NAME str[count];
+	}
+	DNS_RPC_RECORD_STRING;
+
 	typedef struct {
 		uint16 wPriority;
 		uint16 wWeight;
@@ -125,7 +131,7 @@ import "misc.idl", "dnsp.idl";
 		[case(DNS_TYPE_PTR)]   				DNS_RPC_NAME ptr;
 		[case(DNS_TYPE_HINFO)]   			DNS_RPC_NAME hinfo;
 		[case(DNS_TYPE_MX)]   				DNS_RPC_RECORD_NAME_PREFERENCE mx;
-		[case(DNS_TYPE_TXT)]   				DNS_RPC_NAME name;
+		[case(DNS_TYPE_TXT)]   				DNS_RPC_RECORD_STRING txt;
 		[case(DNS_TYPE_AAAA)]   			ipv6address ipv6;
 		[case(DNS_TYPE_SRV)]   				DNS_RPC_RECORD_SRV srv;
 		[case(DNS_TYPE_DNAME)] 				DNS_RPC_NAME name;
diff --git a/librpc/ndr/ndr_dnsp.c b/librpc/ndr/ndr_dnsp.c
index daf8fff..f7300c8 100644
--- a/librpc/ndr/ndr_dnsp.c
+++ b/librpc/ndr/ndr_dnsp.c
@@ -48,7 +48,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_dnsp_name(struct ndr_pull *ndr, int ndr_flag
 
 	ret = talloc_strdup(ndr->current_mem_ctx, "");
 	if (!ret) {
-		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
+		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name");
 	}
 	total_len = 1;
 
@@ -61,7 +61,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_dnsp_name(struct ndr_pull *ndr, int ndr_flag
 		}
 		ret = talloc_realloc(ndr->current_mem_ctx, ret, char, newlen);
 		if (!ret) {
-			return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
+			return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name");
 		}
 		NDR_CHECK(ndr_pull_bytes(ndr, (uint8_t *)&ret[total_len-1], sublen));
 		if (i != count-1) {
@@ -72,10 +72,10 @@ _PUBLIC_ enum ndr_err_code ndr_pull_dnsp_name(struct ndr_pull *ndr, int ndr_flag
 	}
 	NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &termination));
 	if (termination != 0) {
-		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp - not NUL terminated");
+		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name - not NUL terminated");
 	}
 	if (ndr->offset > raw_offset + len) {
-		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp - overrun by %u bytes",
+		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name - overrun by %u bytes",
 				      ndr->offset - (raw_offset + len));
 	}
 	/* there could be additional pad bytes */
@@ -142,12 +142,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_dnsp_string(struct ndr_pull *ndr, int ndr_fl
 
 	ret = talloc_strdup(ndr->current_mem_ctx, "");
 	if (!ret) {
-		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
+		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string");
 	}
 	total_len = 1;
 	ret = talloc_zero_array(ndr->current_mem_ctx, char, len+1);
 	if (!ret) {
-		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
+		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string");
 	}
 	NDR_CHECK(ndr_pull_bytes(ndr, (uint8_t *)&ret[total_len-1], len));
 	total_len = len;
@@ -160,14 +160,66 @@ _PUBLIC_ enum ndr_err_code ndr_pull_dnsp_string(struct ndr_pull *ndr, int ndr_fl
 enum ndr_err_code ndr_push_dnsp_string(struct ndr_push *ndr, int ndr_flags, const char *string)
 {
 	int total_len;
-	total_len = strlen(string) + 1;
+	total_len = strlen(string);
 	if (total_len > 255) {
 		return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
 				      "dns_name of length %d larger than 255", total_len);
 	}
 	NDR_CHECK(ndr_push_uint8(ndr, ndr_flags, (uint8_t)total_len));
-	NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)string, total_len - 1));
-	NDR_PUSH_ALIGN(ndr, 1);
+	NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)string, total_len));
 
 	return NDR_ERR_SUCCESS;
 }
+
+/*
+ * print a dnsp_string_list
+ */
+_PUBLIC_ void ndr_print_dnsp_string_list(struct ndr_print *ndr, const char *name,
+					 const struct dnsp_string_list *list)
+{
+	uint32_t i;
+
+	ndr->no_newline = true;
+	for (i=0; i<ndr->depth; i++) {
+		ndr->print(ndr, "    ");
+	}
+	ndr->print(ndr, "%-25s:", name);
+	for (i=0; i<list->count; i++) {
+		ndr->print(ndr, " \"%s\"", list->str[i]);
+	}
+	ndr->print(ndr, "\n");
+	ndr->no_newline = false;
+}
+
+/*
+ * pull a dnsp_string_list
+ */
+_PUBLIC_ enum ndr_err_code ndr_pull_dnsp_string_list(struct ndr_pull *ndr, int ndr_flags, struct dnsp_string_list *list)
+{
+	list->count = 0;
+	list->str = talloc_array(ndr->current_mem_ctx, char *, list->count);
+	if (! list->str) {
+		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string_list");
+	}
+
+	while (ndr->offset < ndr->data_size) {
+		list->str = talloc_realloc(ndr->current_mem_ctx, list->str, char *, list->count+1);
+		if (! list->str) {
+			return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string_list");
+		}
+		NDR_CHECK(ndr_pull_dnsp_string(ndr, ndr_flags, &list->str[list->count]));
+		list->count++;
+	}
+
+	return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_push_dnsp_string_list(struct ndr_push *ndr, int ndr_flags, const struct dnsp_string_list *list)
+{
+	uint8_t i;
+
+	for (i=0; i<list->count; i++) {
+		NDR_CHECK(ndr_push_dnsp_string(ndr, ndr_flags, list->str[i]));
+	}
+	return NDR_ERR_SUCCESS;
+}
diff --git a/librpc/ndr/ndr_dnsserver.c b/librpc/ndr/ndr_dnsserver.c
index 5eaa7ca..3201f04 100644
--- a/librpc/ndr/ndr_dnsserver.c
+++ b/librpc/ndr/ndr_dnsserver.c
@@ -61,3 +61,40 @@ enum ndr_err_code ndr_push_DNS_RPC_RECORDS_ARRAY(struct ndr_push *ndr,
 
 	return NDR_ERR_SUCCESS;
 }
+
+/*
+ * Parsing of DNS_RPC_RECORD_STRING
+ */
+
+enum ndr_err_code ndr_pull_DNS_RPC_RECORD_STRING(struct ndr_pull *ndr,
+		int ndr_flags, struct DNS_RPC_RECORD_STRING *rec)
+{
+	rec->count = 0;
+	rec->str = talloc_array(ndr->current_mem_ctx, struct DNS_RPC_NAME, rec->count);
+	if (! rec->str) {
+		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORD_STRING");
+	}
+
+	while (ndr->offset < ndr->data_size) {
+		rec->str = talloc_realloc(ndr->current_mem_ctx, rec->str, struct DNS_RPC_NAME, rec->count+1);
+		if (! rec->str) {
+			return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORD_STRING");
+		}
+		NDR_CHECK(ndr_pull_DNS_RPC_NAME(ndr, ndr_flags, &rec->str[rec->count]));
+		rec->count++;
+	}
+
+	return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_push_DNS_RPC_RECORD_STRING(struct ndr_push *ndr,
+		int ndr_flags, const struct DNS_RPC_RECORD_STRING *rec)
+{
+	int i;
+
+	for (i=0; i<rec->count; i++) {
+		NDR_CHECK(ndr_push_DNS_RPC_NAME(ndr, ndr_flags, &rec->str[i]));
+	}
+
+	return NDR_ERR_SUCCESS;
+}
diff --git a/source4/dns_server/dlz_bind9.c b/source4/dns_server/dlz_bind9.c
index 34320e0..cbbdbce 100644
--- a/source4/dns_server/dlz_bind9.c
+++ b/source4/dns_server/dlz_bind9.c
@@ -110,6 +110,9 @@ static bool b9_format(struct dlz_bind9_data *state,
 		      struct dnsp_DnssrvRpcRecord *rec,
 		      const char **type, const char **data)
 {
+	uint32_t i;
+	char *tmp;
+
 	switch (rec->wType) {
 	case DNS_TYPE_A:
 		*type = "a";
@@ -128,7 +131,11 @@ static bool b9_format(struct dlz_bind9_data *state,
 
 	case DNS_TYPE_TXT:
 		*type = "txt";
-		*data = rec->data.txt;
+		tmp = talloc_asprintf(mem_ctx, "\"%s\"", rec->data.txt.str[0]);
+		for (i=1; i<rec->data.txt.count; i++) {
+			tmp = talloc_asprintf_append(tmp, " \"%s\"", rec->data.txt.str[i]);
+		}
+		*data = tmp;
 		break;
 
 	case DNS_TYPE_PTR:
@@ -271,7 +278,7 @@ static bool b9_parse(struct dlz_bind9_data *state,
 		     struct dnsp_DnssrvRpcRecord *rec)
 {
 	char *full_name, *dclass, *type;
-	char *str, *saveptr=NULL;
+	char *str, *tmp, *saveptr=NULL;
 	int i;
 
 	str = talloc_strdup(rec, rdatastr);
@@ -312,7 +319,21 @@ static bool b9_parse(struct dlz_bind9_data *state,
 		break;
 
 	case DNS_TYPE_TXT:
-		DNS_PARSE_STR(rec->data.txt, NULL, "\t", saveptr);
+		rec->data.txt.count = 0;
+		rec->data.txt.str = talloc_array(rec, const char *, rec->data.txt.count);
+		tmp = strtok_r(NULL, "\t", &saveptr);
+		while (tmp) {
+			rec->data.txt.str = talloc_realloc(rec, rec->data.txt.str, const char *,
+							rec->data.txt.count+1);
+			if (tmp[0] == '"') {
+				/* Strip quotes */
+				rec->data.txt.str[rec->data.txt.count] = talloc_strndup(rec, &tmp[1], strlen(tmp)-2);
+			} else {
+				rec->data.txt.str[rec->data.txt.count] = talloc_strdup(rec, tmp);
+			}
+			rec->data.txt.count++;
+			tmp = strtok_r(NULL, " ", &saveptr);
+		}
 		break;
 
 	case DNS_TYPE_PTR:
@@ -1307,6 +1328,9 @@ static bool dns_name_equal(const char *name1, const char *name2)
 static bool b9_record_match(struct dlz_bind9_data *state,
 			    struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2)
 {
+	bool status;
+	int i;
+
 	if (rec1->wType != rec2->wType) {
 		return false;
 	}
@@ -1324,9 +1348,14 @@ static bool b9_record_match(struct dlz_bind9_data *state,
 	case DNS_TYPE_CNAME:
 		return dns_name_equal(rec1->data.cname, rec2->data.cname);
 	case DNS_TYPE_TXT:
-		return strcmp(rec1->data.txt, rec2->data.txt) == 0;
+		status = (rec1->data.txt.count == rec2->data.txt.count);
+		if (!status) return status;
+		for (i=0; i<rec1->data.txt.count; i++) {
+			status &= (strcmp(rec1->data.txt.str[i], rec2->data.txt.str[i]) == 0);
+		}
+		return status;
 	case DNS_TYPE_PTR:
-		return strcmp(rec1->data.ptr, rec2->data.ptr) == 0;
+		return dns_name_equal(rec1->data.ptr, rec2->data.ptr);
 	case DNS_TYPE_NS:
 		return dns_name_equal(rec1->data.ns, rec2->data.ns);
 
@@ -1458,17 +1487,20 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
 		return result;
 	}
 
-	/* there are existing records. We need to see if this will
-	 * replace a record or add to it
-	 */
 	el = ldb_msg_find_element(res->msgs[0], "dnsRecord");
 	if (el == NULL) {
-		state->log(ISC_LOG_ERROR, "samba_dlz: no dnsRecord attribute for %s",
-			   ldb_dn_get_linearized(dn));
-		talloc_free(rec);
-		return ISC_R_FAILURE;
+		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;
+		}
 	}
 
+	/* 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;
 
@@ -1614,9 +1646,10 @@ _PUBLIC_ isc_result_t dlz_subrdataset(const char *name, const char *rdatastr, vo
 	}
 
 	if (el->num_values == 0) {
-		ldb_msg_remove_element(res->msgs[0], el);
+		el->flags = LDB_FLAG_MOD_DELETE;
+	} else {
+		el->flags = LDB_FLAG_MOD_REPLACE;
 	}
-	el->flags = LDB_FLAG_MOD_REPLACE;
 	ret = ldb_modify(state->samdb, res->msgs[0]);
 
 	b9_reset_session_info(state);
@@ -1719,9 +1752,10 @@ _PUBLIC_ isc_result_t dlz_delrdataset(const char *name, const char *type, void *
 	}
 
 	if (el->num_values == 0) {
-		ldb_msg_remove_element(res->msgs[0], el);
+		el->flags = LDB_FLAG_MOD_DELETE;
+	} else {
+		el->flags = LDB_FLAG_MOD_REPLACE;
 	}
-	el->flags = LDB_FLAG_MOD_REPLACE;
 	ret = ldb_modify(state->samdb, res->msgs[0]);
 
 	b9_reset_session_info(state);
diff --git a/source4/dns_server/dns_update.c b/source4/dns_server/dns_update.c
index 3fd612c..62cf9e5 100644
--- a/source4/dns_server/dns_update.c
+++ b/source4/dns_server/dns_update.c
@@ -334,8 +334,15 @@ static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx,
 		W_ERROR_HAVE_NO_MEMORY(r->data.mx.nameTarget);
 		break;
 	case DNS_QTYPE_TXT:
-		r->data.txt = talloc_strdup(mem_ctx, rrec->rdata.txt_record.txt);
-		W_ERROR_HAVE_NO_MEMORY(r->data.txt);
+		/* FIXME: This converts the TXT rr data into a single string.
+		 *        Since dns server does not reply to qtype TXT,
+		 *        this is not yet relevant.
+		 */
+		r->data.txt.count = 1;
+		r->data.txt.str = talloc_array(mem_ctx, const char *, 1);
+		W_ERROR_HAVE_NO_MEMORY(r->data.txt.str);
+		r->data.txt.str[0] = talloc_strdup(mem_ctx, rrec->rdata.txt_record.txt);
+		W_ERROR_HAVE_NO_MEMORY(r->data.txt.str[0]);
 		break;
 	default:
 		DEBUG(0, ("Got a qytpe of %d\n", rrec->rr_type));
diff --git a/source4/dns_server/dns_utils.c b/source4/dns_server/dns_utils.c
index 4649e5f..1f7648c 100644
--- a/source4/dns_server/dns_utils.c
+++ b/source4/dns_server/dns_utils.c
@@ -115,6 +115,9 @@ bool dns_name_equal(const char *name1, const char *name2)
 bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1,
 		       struct dnsp_DnssrvRpcRecord *rec2)
 {
+	bool status;
+	int i;
+
 	if (rec1->wType != rec2->wType) {
 		return false;
 	}
@@ -128,7 +131,15 @@ bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1,
 	case DNS_TYPE_CNAME:
 		return dns_name_equal(rec1->data.cname, rec2->data.cname);
 	case DNS_TYPE_TXT:
-		return strcmp(rec1->data.txt, rec2->data.txt) == 0;
+		if (rec1->data.txt.count != rec2->data.txt.count) {
+			return false;
+		}
+		status = true;
+		for (i=0; i<rec1->data.txt.count; i++) {
+			status = status && (strcmp(rec1->data.txt.str[i],
+						rec2->data.txt.str[i]) == 0);
+		}
+		return status;
 	case DNS_TYPE_PTR:
 		return strcmp(rec1->data.ptr, rec2->data.ptr) == 0;
 	case DNS_TYPE_NS:
diff --git a/source4/rpc_server/dnsserver/dnsdata.c b/source4/rpc_server/dnsserver/dnsdata.c
index 50be4bc..c8ac58d 100644
--- a/source4/rpc_server/dnsserver/dnsdata.c
+++ b/source4/rpc_server/dnsserver/dnsdata.c
@@ -236,7 +236,7 @@ char *dns_split_node_name(TALLOC_CTX *tmp_ctx, const char *node_name, const char
 void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp,
 				struct DNS_RPC_RECORD *dns)
 {
-	int len;
+	int i, len;
 
 	ZERO_STRUCTP(dns);
 
@@ -323,8 +323,12 @@ void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp,
 		break;
 
 	case DNS_TYPE_TXT:
-		dns->data.name.len = strlen(dnsp->data.txt);
-		dns->data.name.str = talloc_strdup(mem_ctx, dnsp->data.txt);
+		dns->data.txt.count = dnsp->data.txt.count;
+		dns->data.txt.str = talloc_array(mem_ctx, struct DNS_RPC_NAME, dnsp->data.txt.count);
+		for (i=0; i<dnsp->data.txt.count; i++) {
+			dns->data.txt.str[i].str = talloc_strdup(mem_ctx, dnsp->data.txt.str[i]);
+			dns->data.txt.str[i].len = strlen(dnsp->data.txt.str[i]);
+		}
 		break;
 
 	case DNS_TYPE_AAAA:
@@ -355,7 +359,7 @@ void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp,
 
 struct dnsp_DnssrvRpcRecord *dns_to_dnsp_copy(TALLOC_CTX *mem_ctx, struct DNS_RPC_RECORD *dns)
 {
-	int len;
+	int i, len;
 	struct dnsp_DnssrvRpcRecord *dnsp;
 
 	dnsp = talloc_zero(mem_ctx, struct dnsp_DnssrvRpcRecord);
@@ -436,7 +440,11 @@ struct dnsp_DnssrvRpcRecord *dns_to_dnsp_copy(TALLOC_CTX *mem_ctx, struct DNS_RP
 		break;
 
 	case DNS_TYPE_TXT:
-		dnsp->data.txt = talloc_strdup(mem_ctx, dns->data.name.str);
+		dnsp->data.txt.count = dns->data.txt.count;
+		dnsp->data.txt.str = talloc_array(mem_ctx, const char *, dns->data.txt.count);
+		for (i=0; i<dns->data.txt.count; i++) {
+			dnsp->data.txt.str[i] = talloc_strdup(mem_ctx, dns->data.txt.str[i].str);
+		}
 		break;
 
 	case DNS_TYPE_AAAA:
@@ -929,6 +937,9 @@ bool dns_name_equal(const char *name1, const char *name2)
 
 bool dns_record_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2)
 {
+	bool status;
+	int i;
+
 	if (rec1->wType != rec2->wType) {
 		return false;
 	}
@@ -963,7 +974,15 @@ bool dns_record_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRe
 			dns_name_equal(rec1->data.mx.nameTarget, rec2->data.srv.nameTarget);
 
 	case DNS_TYPE_TXT:
-		return strcmp(rec1->data.txt, rec2->data.txt) == 0;
+		if (rec1->data.txt.count != rec2->data.txt.count) {
+			return false;
+		}
+		status = true;
+		for (i=0; i<rec1->data.txt.count; i++) {
+			status = status && (strcmp(rec1->data.txt.str[i],
+						   rec2->data.txt.str[i]) == 0);
+		}
+		return status;
 
 	case DNS_TYPE_AAAA:
 		return strcmp(rec1->data.ipv6, rec2->data.ipv6) == 0;
diff --git a/source4/scripting/bin/samba_upgradedns b/source4/scripting/bin/samba_upgradedns
index 234bfe8..1147238 100755
--- a/source4/scripting/bin/samba_upgradedns
+++ b/source4/scripting/bin/samba_upgradedns
@@ -24,6 +24,7 @@ import optparse


-- 
Samba Shared Repository


More information about the samba-cvs mailing list