summaryrefslogtreecommitdiff
path: root/source4/nbt_server/wins/winswack.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/nbt_server/wins/winswack.c')
-rw-r--r--source4/nbt_server/wins/winswack.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/source4/nbt_server/wins/winswack.c b/source4/nbt_server/wins/winswack.c
index e8c5dd6780..793c0a3d8f 100644
--- a/source4/nbt_server/wins/winswack.c
+++ b/source4/nbt_server/wins/winswack.c
@@ -55,12 +55,13 @@ static void wins_wack_deny(struct wack_state *state)
static void wins_wack_allow(struct wack_state *state)
{
NTSTATUS status;
- uint32_t ttl;
- time_t now = time(NULL);
+ uint32_t ttl = wins_server_ttl(state->winssrv, state->request_packet->additional[0].ttl);
struct winsdb_record *rec = state->rec, *rec2;
status = winsdb_lookup(state->winssrv->wins_db, rec->name, state, &rec2);
- if (!NT_STATUS_IS_OK(status) || rec2->version != rec->version) {
+ if (!NT_STATUS_IS_OK(status)
+ || rec2->version != rec->version
+ || strcmp(rec2->wins_owner, rec->wins_owner) != 0) {
DEBUG(1,("WINS: record %s changed during WACK - failing registration\n",
nbt_name_string(state, rec->name)));
wins_wack_deny(state);
@@ -70,18 +71,16 @@ static void wins_wack_allow(struct wack_state *state)
nbtd_name_registration_reply(state->nbtsock, state->request_packet,
&state->src, NBT_RCODE_OK);
- ttl = wins_server_ttl(state->winssrv, state->request_packet->additional[0].ttl);
- if (now + ttl > rec->expire_time) {
- rec->expire_time = now + ttl;
- }
+ rec->expire_time = time(NULL) + ttl;
+ rec->registered_by = state->src.addr;
+
+ /* TODO: is it correct to only add this address? */
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->wins_db, rec, WINSDB_FLAG_ALLOC_VERSION | WINSDB_FLAG_TAKE_OWNERSHIP);
DEBUG(4,("WINS: accepted registration of %s with address %s\n",
@@ -211,5 +210,5 @@ void wins_register_wack(struct nbt_name_socket *nbtsock,
failed:
talloc_free(state);
- nbtd_name_registration_reply(nbtsock, packet, src, NBT_RCODE_SVR);
+ nbtd_name_registration_reply(nbtsock, packet, src, NBT_RCODE_SVR);
}