r6245: receive and parse the GETDC response in the NBT-DGRAM test. The test
authorAndrew Tridgell <tridge@samba.org>
Fri, 8 Apr 2005 05:34:13 +0000 (05:34 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:11:28 +0000 (13:11 -0500)
now tries to bind to port 138 if possible, so if you run it as root
and smbd/nmbd is not running then it works against windows servers
(This used to be commit 52ccdb79bc922be52c24dd393323dbbee83a2aea)

source4/libcli/dgram/libdgram.h
source4/libcli/dgram/mailslot.c
source4/libcli/dgram/netlogon.c
source4/librpc/idl/nbt.idl
source4/torture/nbt/dgram.c

index 482fd8698043d4cf0490edc346eea3af71e56138..0b8157f0c6bbb2bad6e31b83d8790401bd2224e6 100644 (file)
@@ -124,5 +124,7 @@ NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
                                      const char *dest_address,
                                      struct nbt_name *src_name,
                                      struct nbt_netlogon_packet *request);
-
-
+NTSTATUS dgram_mailslot_netlogon_parse(struct dgram_mailslot_handler *dgmslot,
+                                      TALLOC_CTX *mem_ctx,
+                                      struct nbt_dgram_packet *dgram,
+                                      struct nbt_netlogon_packet *netlogon);
index 89aab9c8744343087ba0257aea15c4078999bf98..3b7fcdcd81a972a6f671b50b78518388d14b47fc 100644 (file)
@@ -64,6 +64,8 @@ struct dgram_mailslot_handler *dgram_mailslot_listen(struct nbt_dgram_socket *dg
        DLIST_ADD(dgmsock->mailslot_handlers, dgmslot);
        talloc_set_destructor(dgmslot, dgram_mailslot_destructor);
 
+       EVENT_FD_READABLE(dgmsock->fde);
+
        return dgmslot;
 }
 
index 1f3a3d6c62581b5e5b5176e1fc95643befd24123..c76264eea4dcf88ad48262c6566725f0af9e1d62 100644 (file)
@@ -56,3 +56,19 @@ NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
        return status;
 }
 
+
+/*
+  parse a netlogon response. The packet must be a valid mailslot packet
+*/
+NTSTATUS dgram_mailslot_netlogon_parse(struct dgram_mailslot_handler *dgmslot,
+                                      TALLOC_CTX *mem_ctx,
+                                      struct nbt_dgram_packet *dgram,
+                                      struct nbt_netlogon_packet *netlogon)
+{
+       DATA_BLOB *data = &dgram->data.msg.body.smb.body.trans.data;
+       NTSTATUS status;
+
+       status = ndr_pull_struct_blob(data, mem_ctx, netlogon, 
+                                     (ndr_pull_flags_fn_t)ndr_pull_nbt_netlogon_packet);
+       return status;
+}
index 09738820bb918db370b98cc8e5f879067683979f..6f17a14cde7411296d773614f78242a7a08da224 100644 (file)
@@ -321,7 +321,8 @@ interface nbt
 
        /* \MAILSLOT\NET\NETLOGON mailslot requests */
        typedef [enum8bit] enum {
-               NETLOGON_QUERY_FOR_PDC = 0x7            
+               NETLOGON_QUERY_FOR_PDC     = 0x7,       
+               NETLOGON_RESPONSE_FROM_PDC = 0xc
        } nbt_netlogon_command;
 
        /* query for pdc request */
@@ -334,8 +335,19 @@ interface nbt
                uint16               lm20_token;
        } nbt_netlogon_query_for_pdc;
 
+       /* response from request */
+       typedef struct {
+               astring              pdc_name;
+               nstring              unicode_pdc_name;
+               nstring              domain_name;
+               uint32               nt_version;
+               uint16               lmnt_token;
+               uint16               lm20_token;
+       } nbt_netlogon_response_from_pdc;
+
        typedef [nodiscriminant] union {
                [case(NETLOGON_QUERY_FOR_PDC)] nbt_netlogon_query_for_pdc pdc;
+               [case(NETLOGON_RESPONSE_FROM_PDC)] nbt_netlogon_response_from_pdc response;
        } nbt_netlogon_request;
 
        typedef [flag(NDR_NOALIGN),public] struct {
index c87940a94ddd2feada1a0dfcf88f13642af49e85..b87e7e0b0fd2542e6f002d18b372d23771515a1b 100644 (file)
@@ -36,9 +36,22 @@ static void netlogon_handler(struct dgram_mailslot_handler *dgmslot,
                             struct nbt_dgram_packet *packet, 
                             const char *src_address, int src_port)
 {
+       NTSTATUS status;
+       struct nbt_netlogon_packet netlogon;
+
        printf("netlogon reply from %s:%d\n", src_address, src_port);
+
+       status = dgram_mailslot_netlogon_parse(dgmslot, dgmslot, packet, &netlogon);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to parse netlogon packet from %s:%d\n",
+                      src_address, src_port);
+               return;
+       }
+
+       NDR_PRINT_DEBUG(nbt_netlogon_packet, &netlogon);
 }
 
+
 /* test UDP/138 netlogon requests */
 static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx, 
                              struct nbt_name name, const char *address)
@@ -52,7 +65,14 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
        int timelimit = lp_parm_int(-1, "torture", "timelimit", 10);
        struct timeval tv = timeval_current();
 
-       socket_listen(dgmsock->sock, myaddress, 0, 0, 0);
+       /* try receiving replies on port 138 first, which will only
+          work if we are root and smbd/nmbd are not running - fall
+          back to listening on any port, which means replies from
+          some windows versions won't be seen */
+       status = socket_listen(dgmsock->sock, myaddress, lp_dgram_port(), 0, 0);
+       if (!NT_STATUS_IS_OK(status)) {
+               socket_listen(dgmsock->sock, myaddress, 0, 0, 0);
+       }
 
        /* setup a temporary mailslot listener for replies */
        dgmslot = dgram_mailslot_temp(dgmsock, "\\MAILSLOT\\NET\\GETDC",