svn commit: samba r10620 - in branches/tmp/samba4-winsrepl/source: nbt_server/wins wrepl_server

metze at samba.org metze at samba.org
Thu Sep 29 16:07:09 GMT 2005


Author: metze
Date: 2005-09-29 16:07:08 +0000 (Thu, 29 Sep 2005)
New Revision: 10620

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10620

Log:
- handle mutliple addresses in WREPL_REPL_SEND_REPLY
- make strings always valid talloc pointers

metze
Modified:
   branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c
   branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c


Changeset:
Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c
===================================================================
--- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c	2005-09-29 15:57:21 UTC (rev 10619)
+++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c	2005-09-29 16:07:08 UTC (rev 10620)
@@ -183,7 +183,11 @@
 	if (!p) {
 		/* support old entries, with only the address */
 		addr->address		= talloc_steal(addr, val->data);
-		addr->wins_owner	= rec->wins_owner;
+		addr->wins_owner	= talloc_reference(addr, rec->wins_owner);
+		if (!addr->wins_owner) {
+			status = NT_STATUS_NO_MEMORY;
+			goto failed;
+		}
 		addr->expire_time	= rec->expire_time;
 		*_addr = addr;
 		return NT_STATUS_OK;
@@ -439,7 +443,13 @@
 	talloc_steal(rec, rec->wins_owner);
 	talloc_steal(rec, rec->registered_by);
 
-	if (!rec->wins_owner) rec->wins_owner = WINSDB_OWNER_LOCAL;
+	if (!rec->wins_owner) {
+		rec->wins_owner = talloc_strdup(rec, WINSDB_OWNER_LOCAL);
+		if (rec->wins_owner == NULL) {
+			status = NT_STATUS_NO_MEMORY;
+			goto failed;
+		}
+	}
 
 	el = ldb_msg_find_element(msg, "address");
 	if (el == NULL) {
@@ -447,6 +457,13 @@
 		goto failed;
 	}
 
+	if (!(rec->nb_flags & 2)) {
+		if (el->num_values != 1) {
+			status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+			goto failed;
+		}
+	}
+
 	rec->addresses     = talloc_array(rec, struct winsdb_addr *, el->num_values+1);
 	if (rec->addresses == NULL) {
 		status = NT_STATUS_NO_MEMORY;

Modified: branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c
===================================================================
--- branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c	2005-09-29 15:57:21 UTC (rev 10619)
+++ branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c	2005-09-29 16:07:08 UTC (rev 10620)
@@ -157,8 +157,14 @@
 	return 0;
 }
 
-static NTSTATUS wreplsrv_record2wins_name(TALLOC_CTX *mem_ctx, struct wrepl_wins_name *name, struct winsdb_record *rec)
+static NTSTATUS wreplsrv_record2wins_name(TALLOC_CTX *mem_ctx,
+					  const char *our_address,
+					  struct wrepl_wins_name *name,
+					  struct winsdb_record *rec)
 {
+	uint32_t num_ips, i;
+	struct wrepl_ip *ips;
+
 	name->name		= *rec->name;
 	talloc_steal(mem_ctx, rec->name->name);
 	talloc_steal(mem_ctx, rec->name->scope);
@@ -174,8 +180,24 @@
 		talloc_steal(mem_ctx, rec->addresses[0]->address);
 		break;
 	case 2:
-		name->addresses.addresses.num_ips	= 0;
-		name->addresses.addresses.ips		= NULL;
+		num_ips	= winsdb_addr_list_length(rec->addresses);
+		ips	= talloc_array(mem_ctx, struct wrepl_ip, num_ips);
+		NT_STATUS_HAVE_NO_MEMORY(ips);
+
+		for (i = 0; i < num_ips; i++) {
+			if (strcasecmp(WINSDB_OWNER_LOCAL, rec->addresses[i]->wins_owner) == 0) {
+				ips[i].owner	= talloc_strdup(ips, our_address);
+				NT_STATUS_HAVE_NO_MEMORY(ips[i].owner);
+			} else {
+				ips[i].owner	= rec->addresses[i]->wins_owner;
+				talloc_steal(ips, rec->addresses[i]->wins_owner);
+			}
+			ips[i].ip	= rec->addresses[i]->address;
+			talloc_steal(ips, rec->addresses[i]->address);
+		}
+
+		name->addresses.addresses.num_ips	= num_ips;
+		name->addresses.addresses.ips		= ips;
 		break;
 	}
 
@@ -254,7 +276,7 @@
 		status = winsdb_record(res[i], NULL, call, &rec);
 		NT_STATUS_NOT_OK_RETURN(status);
 
-		status = wreplsrv_record2wins_name(names, &names[i], rec);
+		status = wreplsrv_record2wins_name(names, call->wreplconn->our_ip, &names[i], rec);
 		NT_STATUS_NOT_OK_RETURN(status);
 		talloc_free(rec);
 		talloc_free(res[i]);
@@ -263,6 +285,10 @@
 	/* sort the names before we send them */
 	qsort(names, ret, sizeof(struct wrepl_wins_name), (comparison_fn_t)wreplsrv_in_sort_wins_name);
 
+	DEBUG(0,("WINSREPL:reply [%u] records owner[%s] min[%llu] max[%llu] to partner[%s]\n",
+		ret, owner_in->address, owner_in->min_version, owner_in->max_version,
+		call->wreplconn->partner->address));
+
 	reply_out->num_names	= ret;
 	reply_out->names	= names;
 



More information about the samba-cvs mailing list