svn commit: samba r11027 - in branches/SAMBA_4_0: . source/nbt_server/wins

metze at samba.org metze at samba.org
Fri Oct 14 12:50:14 GMT 2005


Author: metze
Date: 2005-10-14 12:50:11 +0000 (Fri, 14 Oct 2005)
New Revision: 11027

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

Log:
 r10319 at SERNOX:  metze | 2005-09-19 18:31:23 +0200
 - store the wins owner on the record and the wins owner and expire time on each address
 - we use "0.0.0.0" to mark entries which are registered at the local wins server
 - we use this ldif-format:
 address: 172.31.9.1;winsOwner:0.0.0.0;expireTime:20050923032337.0Z
 address: 172.31.1.1;winsOwner:172.31.9.202;expireTime:20050923032330.0Z
 
 metze

Modified:
   branches/SAMBA_4_0/
   branches/SAMBA_4_0/source/nbt_server/wins/winsdb.c
   branches/SAMBA_4_0/source/nbt_server/wins/winsdb.h
   branches/SAMBA_4_0/source/nbt_server/wins/winsserver.c
   branches/SAMBA_4_0/source/nbt_server/wins/winswack.c


Changeset:

Property changes on: branches/SAMBA_4_0
___________________________________________________________________
Name: svk:merge
   - 0c0555d6-39d7-0310-84fc-f1cc0bd64818:/branches/tmp/samba4-winsrepl:10318
3a72dc49-98ff-0310-ab52-9b7ed7945d91:/local/samba4:9495
a953eb74-4aff-0310-a63c-855d20285ebb:/local/samba4:11632
d349723c-e9fc-0310-b8a8-fdedf1c27407:/local/SAMBA_4_0:5616
d349723c-e9fc-0310-b8a8-fdedf1c27407:/local/samba-SAMBA_4_0:5609
   + 0c0555d6-39d7-0310-84fc-f1cc0bd64818:/branches/tmp/samba4-winsrepl:10319
3a72dc49-98ff-0310-ab52-9b7ed7945d91:/local/samba4:9495
a953eb74-4aff-0310-a63c-855d20285ebb:/local/samba4:11632
d349723c-e9fc-0310-b8a8-fdedf1c27407:/local/SAMBA_4_0:5616
d349723c-e9fc-0310-b8a8-fdedf1c27407:/local/samba-SAMBA_4_0:5609

Modified: branches/SAMBA_4_0/source/nbt_server/wins/winsdb.c
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/wins/winsdb.c	2005-10-14 12:49:55 UTC (rev 11026)
+++ branches/SAMBA_4_0/source/nbt_server/wins/winsdb.c	2005-10-14 12:50:11 UTC (rev 11027)
@@ -119,26 +119,92 @@
 	return dn;
 }
 
-static struct winsdb_addr *winsdb_addr_decode(TALLOC_CTX *mem_ctx, struct ldb_val *val)
+/*
+ decode the winsdb_addr("address") attribute:
+ "172.31.1.1" or 
+ "172.31.1.1;winsOwner:172.31.9.202;expireTime:20050923032330.0Z"
+ are valid records
+*/
+static struct winsdb_addr *winsdb_addr_decode(struct winsdb_record *rec, TALLOC_CTX *mem_ctx, struct ldb_val *val)
 {
 	struct winsdb_addr *addr;
+	char *address;
+	char *wins_owner;
+	char *expire_time;
+	char *p;
 
 	addr = talloc(mem_ctx, struct winsdb_addr);
 	if (!addr) return NULL;
 
-	addr->address = talloc_steal(addr, val->data);
+	address = (char *)val->data;
 
+	p = strchr(address, ';');
+	if (!p) {
+		/* support old entries, with only the address */
+		addr->address		= talloc_steal(addr, val->data);
+		addr->wins_owner	= rec->wins_owner;
+		addr->expire_time	= rec->expire_time;
+		return addr;
+	}
+
+	*p = '\0';p++;
+	addr->address = talloc_strdup(addr, address);
+	if (!addr->address) {
+		talloc_free(addr);
+		return NULL;
+	}
+
+	if (strncmp("winsOwner:", p, 10) != 0) {
+		/* invalid record */
+		talloc_free(addr);
+		return NULL;
+	}
+	wins_owner = p + 10;
+	p = strchr(wins_owner, ';');
+	if (!p) {
+		/* invalid record */
+		talloc_free(addr);
+		return NULL;
+	}
+
+	*p = '\0';p++;
+	addr->wins_owner = talloc_strdup(addr, wins_owner);
+	if (!addr->wins_owner) {
+		talloc_free(addr);
+		return NULL;
+	}
+
+	if (strncmp("expireTime:", p, 11) != 0) {
+		/* invalid record */
+		talloc_free(addr);
+		return NULL;
+	}
+
+	expire_time = p + 11;
+
+	addr->expire_time = ldap_string_to_time(expire_time);
+
 	return addr;
 }
 
+/*
+ encode the winsdb_addr("address") attribute like this:
+ "172.31.1.1;winsOwner:172.31.9.202;expireTime:20050923032330.0Z"
+*/
 static int ldb_msg_add_winsdb_addr(struct ldb_context *ldb, struct ldb_message *msg, 
 				   const char *attr_name, struct winsdb_addr *addr)
 {
 	struct ldb_val val;
+	const char *str;
 
-	val.data = discard_const_p(uint8_t, addr->address);
-	val.length = strlen(addr->address);
+	str = talloc_asprintf(msg, "%s;winsOwner:%s;expireTime:%s",
+			      addr->address, addr->wins_owner,
+			      ldap_timestring(msg, addr->expire_time));
+	if (!str) return -1;
 
+	val.data = discard_const_p(uint8_t, str);
+	val.length = strlen(str);
+
 	return ldb_msg_add_value(ldb, msg, attr_name, &val);
 }
 
@@ -154,7 +220,8 @@
 	return addresses;
 }
 
-struct winsdb_addr **winsdb_addr_list_add(struct winsdb_addr **addresses, const char *address)
+struct winsdb_addr **winsdb_addr_list_add(struct winsdb_addr **addresses, const char *address,
+					  const char *wins_owner, time_t expire_time)
 {
 	size_t len = winsdb_addr_list_length(addresses);
 
@@ -170,9 +237,17 @@
 	addresses[len]->address = talloc_strdup(addresses[len], address);
 	if (!addresses[len]->address) {
 		talloc_free(addresses);
-		return NULL;	
+		return NULL;
 	}
 
+	addresses[len]->wins_owner = talloc_strdup(addresses[len], wins_owner);
+	if (!addresses[len]->wins_owner) {
+		talloc_free(addresses);
+		return NULL;
+	}
+
+	addresses[len]->expire_time = expire_time;
+
 	addresses[len+1] = NULL;
 
 	return addresses;
@@ -268,8 +343,11 @@
 	rec->expire_time    = ldb_string_to_time(ldb_msg_find_string(res[0], "expires", NULL));
 	rec->registered_by  = ldb_msg_find_string(res[0], "registeredBy", NULL);
 	rec->version        = ldb_msg_find_uint64(res[0], "version", 0);
+	talloc_steal(rec, rec->wins_owner);
 	talloc_steal(rec, rec->registered_by);
 
+	if (!rec->wins_owner) rec->wins_owner = WINSDB_OWNER_LOCAL;
+
 	el = ldb_msg_find_element(res[0], "address");
 	if (el == NULL) goto failed;
 
@@ -277,7 +355,7 @@
 	if (rec->addresses == NULL) goto failed;
 
 	for (i=0;i<el->num_values;i++) {
-		rec->addresses[i] = winsdb_addr_decode(rec->addresses, &el->values[i]);
+		rec->addresses[i] = winsdb_addr_decode(rec, rec->addresses, &el->values[i]);
 		if (rec->addresses[i] == NULL) goto failed;
 	}
 	rec->addresses[i] = NULL;
@@ -383,6 +461,7 @@
 
 	rec->version = winsdb_allocate_version(winssrv);
 	if (rec->version == 0) goto failed;
+	rec->wins_owner = WINSDB_OWNER_LOCAL;
 
 	msg = winsdb_message(winssrv, rec, tmp_ctx);
 	if (msg == NULL) goto failed;

Modified: branches/SAMBA_4_0/source/nbt_server/wins/winsdb.h
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/wins/winsdb.h	2005-10-14 12:49:55 UTC (rev 11026)
+++ branches/SAMBA_4_0/source/nbt_server/wins/winsdb.h	2005-10-14 12:50:11 UTC (rev 11027)
@@ -25,8 +25,13 @@
 	WINS_REC_ACTIVE   =1
 };
 
+#define WINSDB_OWNER_LOCAL	"0.0.0.0"
+#define WINSDB_GROUP_ADDRESS	"255.255.255.255"
+
 struct winsdb_addr {
 	const char *address;
+	const char *wins_owner;
+	time_t expire_time;
 };
 
 /*
@@ -36,6 +41,7 @@
 	struct nbt_name *name;
 	uint16_t nb_flags;
 	enum wins_record_state state;
+	const char *wins_owner;
 	time_t expire_time;
 	const char *registered_by;
 	struct winsdb_addr **addresses;

Modified: branches/SAMBA_4_0/source/nbt_server/wins/winsserver.c
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/wins/winsserver.c	2005-10-14 12:49:55 UTC (rev 11026)
+++ branches/SAMBA_4_0/source/nbt_server/wins/winsserver.c	2005-10-14 12:50:11 UTC (rev 11027)
@@ -59,11 +59,14 @@
 	rec.registered_by = src->addr;
 	rec.addresses     = winsdb_addr_list_make(packet);
 	if (rec.addresses == NULL) return NBT_RCODE_SVR;
+
 	if (IS_GROUP_NAME(name, nb_flags)) {
-		rec.addresses     = winsdb_addr_list_add(rec.addresses, "255.255.255.255");
-	} else {
-		rec.addresses     = winsdb_addr_list_add(rec.addresses, address);
+		address = WINSDB_GROUP_ADDRESS;
 	}
+	rec.addresses     = winsdb_addr_list_add(rec.addresses,
+						 address,
+						 WINSDB_OWNER_LOCAL,
+						 rec.expire_time);
 	if (rec.addresses == NULL) return NBT_RCODE_SVR;
 
 	DEBUG(4,("WINS: accepted registration of %s with address %s\n",

Modified: branches/SAMBA_4_0/source/nbt_server/wins/winswack.c
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/wins/winswack.c	2005-10-14 12:49:55 UTC (rev 11026)
+++ branches/SAMBA_4_0/source/nbt_server/wins/winswack.c	2005-10-14 12:50:11 UTC (rev 11027)
@@ -69,13 +69,16 @@
 	nbtd_name_registration_reply(state->nbtsock, state->request_packet, 
 				     &state->src, NBT_RCODE_OK);
 
-	rec->addresses = winsdb_addr_list_add(rec->addresses, state->reg_address);
-	if (rec->addresses == NULL) goto failed;
-	
 	ttl = wins_server_ttl(state->winssrv, state->request_packet->additional[0].ttl);
 	if (now + ttl > rec->expire_time) {
 		rec->expire_time = now + ttl;
 	}
+	rec->addresses = winsdb_addr_list_add(rec->addresses,
+					      state->reg_address,
+					      WINSDB_OWNER_LOCAL,
+					      rec->expire_time);
+	if (rec->addresses == NULL) goto failed;
+
 	rec->registered_by = state->src.addr;
 
 	winsdb_modify(state->winssrv, rec);



More information about the samba-cvs mailing list