summaryrefslogtreecommitdiff
path: root/source4/nbt_server/wins/winsserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/nbt_server/wins/winsserver.c')
-rw-r--r--source4/nbt_server/wins/winsserver.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/source4/nbt_server/wins/winsserver.c b/source4/nbt_server/wins/winsserver.c
index 8a5fabae4e..0f6717f4a9 100644
--- a/source4/nbt_server/wins/winsserver.c
+++ b/source4/nbt_server/wins/winsserver.c
@@ -36,6 +36,21 @@ uint32_t wins_server_ttl(struct wins_server *winssrv, uint32_t ttl)
return ttl;
}
+static enum wrepl_name_type wrepl_type(uint16_t nb_flags, struct nbt_name *name, BOOL mhomed)
+{
+ /* this copes with the nasty hack that is the type 0x1c name */
+ if (name->type != NBT_NAME_LOGON) {
+ return WREPL_TYPE_SGROUP;
+ }
+ if (nb_flags & NBT_NM_GROUP) {
+ return WREPL_TYPE_GROUP;
+ }
+ if (mhomed) {
+ return WREPL_TYPE_MHOMED;
+ }
+ return WREPL_TYPE_UNIQUE;
+}
+
/*
register a new name with WINS
*/
@@ -51,6 +66,9 @@ static uint8_t wins_register_new(struct nbt_name_socket *nbtsock,
uint16_t nb_flags = packet->additional[0].rdata.netbios.addresses[0].nb_flags;
const char *address = packet->additional[0].rdata.netbios.addresses[0].ipaddr;
struct winsdb_record rec;
+ enum wrepl_name_type type;
+ enum wrepl_name_node node;
+ BOOL mhomed = ((packet->operation & NBT_OPCODE) == NBT_OPCODE_MULTI_HOME_REG);
rec.name = name;
rec.nb_flags = nb_flags;
@@ -137,7 +155,7 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
}
/* its an active name - first see if the registration is of the right type */
- if ((rec->nb_flags & NBT_NM_GROUP) && !(nb_flags & NBT_NM_GROUP)) {
+ if ((rec->type == WREPL_TYPE_GROUP) && !(nb_flags & NBT_NM_GROUP)) {
DEBUG(2,("WINS: Attempt to register unique name %s when group name is active\n",
nbt_name_string(packet, name)));
rcode = NBT_RCODE_ACT;
@@ -158,6 +176,15 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
goto done;
}
+ /*
+ * TODO: this complete functions needs a lot of work,
+ * to handle special group and multiomed registrations
+ */
+ if (name->type == NBT_NAME_LOGON) {
+ wins_update_ttl(nbtsock, packet, rec, src);
+ goto done;
+ }
+
/* if the registration is for an address that is currently active, then
just update the expiry time */
if (winsdb_addr_list_check(rec->addresses, address)) {
@@ -246,7 +273,7 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
DEBUG(4,("WINS: released name %s at %s\n", nbt_name_string(rec, rec->name), address));
winsdb_addr_list_remove(rec->addresses, address);
if (rec->addresses[0] == NULL) {
- rec->state = WINS_REC_RELEASED;
+ rec->state = WREPL_STATE_RELEASED;
}
winsdb_modify(winssrv, rec);
}