Author: metze Date: 2005-09-19 16:31:23 +0000 (Mon, 19 Sep 2005) New Revision: 10319
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10319 Log: - 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/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c branches/tmp/samba4-winsrepl/source/nbt_server/wins/winswack.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-19 14:38:15 UTC (rev 10318) +++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c 2005-09-19 16:31:23 UTC (rev 10319) @@ -96,26 +96,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); } @@ -131,7 +197,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); @@ -147,9 +214,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; @@ -242,11 +317,15 @@ rec->name = name; rec->state = ldb_msg_find_int(res[0], "active", WINS_REC_RELEASED); rec->nb_flags = ldb_msg_find_int(res[0], "nbFlags", 0); + rec->wins_owner = ldb_msg_find_string(res[0], "winsOwner", NULL); rec->expire_time = ldap_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; @@ -254,7 +333,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; @@ -294,6 +373,7 @@ ret |= ldb_msg_add_fmt(ldb, msg, "active", "%u", rec->state); ret |= ldb_msg_add_fmt(ldb, msg, "nbFlags", "0x%04x", rec->nb_flags); ret |= ldb_msg_add_string(ldb, msg, "registeredBy", rec->registered_by); + ret |= ldb_msg_add_string(ldb, msg, "winsOwner", rec->wins_owner); ret |= ldb_msg_add_string(ldb, msg, "expires", ldap_timestring(msg, rec->expire_time)); ret |= ldb_msg_add_fmt(ldb, msg, "version", "%llu", rec->version); @@ -348,6 +428,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/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h =================================================================== --- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h 2005-09-19 14:38:15 UTC (rev 10318) +++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h 2005-09-19 16:31:23 UTC (rev 10319) @@ -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/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c =================================================================== --- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c 2005-09-19 14:38:15 UTC (rev 10318) +++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c 2005-09-19 16:31:23 UTC (rev 10319) @@ -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/tmp/samba4-winsrepl/source/nbt_server/wins/winswack.c =================================================================== --- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winswack.c 2005-09-19 14:38:15 UTC (rev 10318) +++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winswack.c 2005-09-19 16:31:23 UTC (rev 10319) @@ -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);
