r5397: added testing and server support for the special handling required for the...
authorAndrew Tridgell <tridge@samba.org>
Mon, 14 Feb 2005 12:46:03 +0000 (12:46 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:09:51 +0000 (13:09 -0500)
in WINS
(This used to be commit 2650b43ca903fb478d2943fa9bbdba8b2bf74966)

source4/nbt_server/winsserver.c
source4/torture/nbt/wins.c

index 38f874a196c772e14bdff8b7581c81f96d86e5db..45b147d86d1eb8e687b8a43c79cdac982d5f5371 100644 (file)
@@ -112,6 +112,12 @@ static void nbtd_winsserver_register(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;
 
+       /* as a special case, the local master browser name is always accepted
+          for registration, but never stored */
+       if (name->type == NBT_NAME_MASTER) {
+               goto done;
+       }
+
        rec = winsdb_load(winssrv, name, packet);
        if (rec == NULL) {
                rcode = wins_register_new(nbtsock, packet, src_address, src_port);
index 0fd8602a355b3a5036ff65eca432ae73feec959a..9258f3b517944b30b4bf18213c2ca6b233a87152 100644 (file)
@@ -111,7 +111,7 @@ static BOOL nbt_test_wins_name(TALLOC_CTX *mem_ctx, const char *address,
        CHECK_STRING(io.out.wins_server, address);
        CHECK_VALUE(io.out.rcode, 0);
 
-       if (nb_flags & NBT_NM_GROUP) {
+       if (name->type != NBT_NAME_MASTER && nb_flags & NBT_NM_GROUP) {
                printf("Try to register as non-group\n");
                io.in.nb_flags &= ~NBT_NM_GROUP;
                status = nbt_name_register_wins(nbtsock, mem_ctx, &io);
@@ -132,6 +132,14 @@ static BOOL nbt_test_wins_name(TALLOC_CTX *mem_ctx, const char *address,
        query.in.retries = 0;
 
        status = nbt_name_query(nbtsock, mem_ctx, &query);
+       if (name->type == NBT_NAME_MASTER) {
+               if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
+                       printf("Bad response from %s for name query - %s\n",
+                              address, nt_errstr(status));
+                       return False;
+               }
+               return ret;
+       }
        if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
                printf("No response from %s for name query\n", address);
                return False;
@@ -287,6 +295,11 @@ static BOOL nbt_test_wins(TALLOC_CTX *mem_ctx, const char *address)
        name.scope = NULL;
        ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H);
 
+       name.type = NBT_NAME_MASTER;
+       ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H);
+
+       ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H | NBT_NM_GROUP);
+
        name.scope = "example";
        name.type = 0x72;
        ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H);