- bug in nmbd registering DOMAIN_NAME<1c> to WINS server; recursion
authorLuke Leighton <lkcl@samba.org>
Fri, 19 Nov 1999 01:01:07 +0000 (01:01 +0000)
committerLuke Leighton <lkcl@samba.org>
Fri, 19 Nov 1999 01:01:07 +0000 (01:01 +0000)
  desired flag MUST be set in any NBT UDP packets sent to a WINS
  server, else they will go to the WINS client side of the NT NetBIOS
  kernel instead, and will get trashed.

- added \PIPE\browser server-side code.
(This used to be commit 8e406c1fa296c3f97b1cd7ddde7b5aeb9232b26e)

source3/Makefile.in
source3/include/proto.h
source3/nmbd/nmbd_namelistdb.c
source3/nmbd/nmbd_packets.c
source3/rpc_server/srv_brs.c [new file with mode: 0644]
source3/rpc_server/srv_pipe.c
source3/smbd/nttrans.c

index 37cf1317d7698cbba09e36aea9da4a5b52a1bdc3..8e04fa8ff783cc12cd22b45392bb887fc00c911c 100644 (file)
@@ -136,6 +136,7 @@ RPC_SERVER_OBJ = \
                rpc_server/srv_pipe.o \
                rpc_server/srv_lookup.o \
                rpc_server/srv_wkssvc.o \
+               rpc_server/srv_brs.o \
                rpc_server/srv_spoolss.o
 
 RPC_PARSE_OBJ1 = rpc_parse/parse_lsa.o \
index bd38d58136002a8fe6aa1f492f48a37e3c1c2885..35ac728921183a68780b18ab4be7382b643f377e 100644 (file)
@@ -3315,6 +3315,10 @@ BOOL make_wks_r_query_info(WKS_R_QUERY_INFO *r_u,
                                int status)  ;
 BOOL wks_io_r_query_info(char *desc,  WKS_R_QUERY_INFO *r_u, prs_struct *ps, int depth);
 
+/*The following definitions come from  rpc_server/srv_brs.c  */
+
+BOOL api_brs_rpc(pipes_struct *p, prs_struct *data);
+
 /*The following definitions come from  rpc_server/srv_lookup.c  */
 
 int make_dom_gids(DOMAIN_GRP *mem, int num_members, DOM_GID **ppgids);
index 8d6d139867d22295a47a2592a2ef58e16eb0301a..0bc5fd875a7a42861eb91a25cb9a4cc1772bebc4 100644 (file)
@@ -42,6 +42,8 @@ void set_samba_nb_type(void)
     samba_nb_type = NB_MFLAG;               /* samba is a 'hybrid' node type. */
   else
     samba_nb_type = NB_BFLAG;           /* samba is broadcast-only node type. */
+
+       DEBUG(10,("set_samba_nb_type: %x\n", samba_nb_type));
   } /* set_samba_nb_type */
 
 /* ************************************************************************** **
index f10d9a2bc5415e9754f9bdea45fb5ad3a1ea8d1b..c39699f822e8bf8575efc0c825e71eb7dddeb206 100644 (file)
@@ -143,6 +143,7 @@ static BOOL send_netbios_packet(struct packet_struct *p)
 
 static struct packet_struct *create_and_init_netbios_packet(struct nmb_name *nmbname,
                                                             BOOL bcast,
+                                                            BOOL rec_des,
                                                             struct in_addr to_ip)
 {
   struct packet_struct *packet = NULL;
@@ -161,7 +162,7 @@ static struct packet_struct *create_and_init_netbios_packet(struct nmb_name *nmb
 
   nmb->header.name_trn_id = generate_name_trn_id();
   nmb->header.response = False;
-  nmb->header.nm_flags.recursion_desired = False;
+  nmb->header.nm_flags.recursion_desired = rec_des;
   nmb->header.nm_flags.recursion_available = False;
   nmb->header.nm_flags.trunc = False;
   nmb->header.nm_flags.authoritative = False;
@@ -430,11 +431,12 @@ struct response_record *queue_register_name( struct subnet_record *subrec,
   struct packet_struct *p;
   struct response_record *rrec;
   BOOL bcast = (subrec == unicast_subnet) ? False : True;
+  BOOL rec_des = (subrec == wins_server_subnet) ? True : False;
 
   if(assert_check_subnet(subrec))
     return NULL;
 
-  if(( p = create_and_init_netbios_packet(nmbname, bcast, 
+  if(( p = create_and_init_netbios_packet(nmbname, bcast, rec_des,
                      subrec->bcast_ip)) == NULL)
     return NULL;
 
@@ -479,6 +481,7 @@ struct response_record *queue_register_multihomed_name( struct subnet_record *su
   struct packet_struct *p;
   struct response_record *rrec;
   BOOL bcast = False;
+  BOOL rec_des = (subrec == wins_server_subnet) ? True : False;
   BOOL ret;
      
   /* Sanity check. */
@@ -492,7 +495,7 @@ unicast subnet. subnet is %s\n.", subrec->subnet_name ));
   if(assert_check_subnet(subrec))
     return NULL;
      
-  if(( p = create_and_init_netbios_packet(nmbname, bcast,
+  if(( p = create_and_init_netbios_packet(nmbname, bcast, rec_des,
                              subrec->bcast_ip)) == NULL)
     return NULL;
 
@@ -539,13 +542,14 @@ struct response_record *queue_release_name( struct subnet_record *subrec,
                           struct in_addr release_ip)
 {
   BOOL bcast = (subrec == unicast_subnet) ? False : True;
+  BOOL rec_des = (subrec == wins_server_subnet) ? True : False;
   struct packet_struct *p;
   struct response_record *rrec;
 
   if(assert_check_subnet(subrec))
     return NULL;
 
-  if(( p = create_and_init_netbios_packet(nmbname, bcast, 
+  if(( p = create_and_init_netbios_packet(nmbname, bcast, rec_des,
                      subrec->bcast_ip)) == NULL)
     return NULL;
 
@@ -597,13 +601,14 @@ struct response_record *queue_refresh_name( struct subnet_record *subrec,
                           struct in_addr refresh_ip)
 {
   BOOL bcast = (subrec == unicast_subnet) ? False : True;
+  BOOL rec_des = (subrec == wins_server_subnet) ? True : False;
   struct packet_struct *p;
   struct response_record *rrec;
 
   if(assert_check_subnet(subrec))
     return NULL;
 
-  if(( p = create_and_init_netbios_packet(&namerec->name, bcast,
+  if(( p = create_and_init_netbios_packet(&namerec->name, bcast,rec_des,
                      subrec->bcast_ip)) == NULL)
     return NULL;
 
@@ -645,6 +650,7 @@ struct response_record *queue_query_name( struct subnet_record *subrec,
   struct packet_struct *p;
   struct response_record *rrec;
   BOOL bcast = True;
+  BOOL rec_des = (subrec == wins_server_subnet) ? True : False;
 
   if ((subrec == unicast_subnet) || (subrec == wins_server_subnet))
     bcast = False;
@@ -652,7 +658,7 @@ struct response_record *queue_query_name( struct subnet_record *subrec,
   if(assert_check_subnet(subrec))
     return NULL;
 
-  if(( p = create_and_init_netbios_packet(nmbname, bcast,
+  if(( p = create_and_init_netbios_packet(nmbname, bcast,rec_des,
                      subrec->bcast_ip)) == NULL)
     return NULL;
 
@@ -694,8 +700,10 @@ struct response_record *queue_query_name_from_wins_server( struct in_addr to_ip,
   struct packet_struct *p;
   struct response_record *rrec;
   BOOL bcast = False;
+  BOOL rec_des = True;
 
-  if(( p = create_and_init_netbios_packet(nmbname, bcast, to_ip)) == NULL)
+  if(( p = create_and_init_netbios_packet(nmbname, bcast, rec_des,
+               to_ip)) == NULL)
     return NULL;
 
   if(initiate_name_query_packet_from_wins_server( p ) == False)
@@ -737,6 +745,7 @@ struct response_record *queue_node_status( struct subnet_record *subrec,
   struct packet_struct *p;
   struct response_record *rrec;
   BOOL bcast = False;
+  BOOL rec_des = (subrec == wins_server_subnet) ? True : False;
 
   /* Sanity check. */
   if(subrec != unicast_subnet)
@@ -749,7 +758,7 @@ unicast subnet. subnet is %s\n.", subrec->subnet_name ));
   if(assert_check_subnet(subrec))
     return NULL;
 
-  if(( p = create_and_init_netbios_packet(nmbname, bcast,
+  if(( p = create_and_init_netbios_packet(nmbname, bcast,rec_des,
                              send_ip)) == NULL)
     return NULL;
 
diff --git a/source3/rpc_server/srv_brs.c b/source3/rpc_server/srv_brs.c
new file mode 100644 (file)
index 0000000..c2abd28
--- /dev/null
@@ -0,0 +1,98 @@
+
+/* 
+ *  Unix SMB/Netbios implementation.
+ *  Version 1.9.
+ *  RPC Pipe client / server routines
+ *  Copyright (C) Andrew Tridgell              1992-1999,
+ *  Copyright (C) Luke Kenneth Casson Leighton 1996-1999,
+ *  
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "includes.h"
+#include "nterr.h"
+
+extern int DEBUGLEVEL;
+extern pstring global_myname;
+
+
+/*******************************************************************
+ create_brs_info_100
+ ********************************************************************/
+static void create_brs_info_100(BRS_INFO_100 *inf)
+{
+       DEBUG(5,("create_brs_info_100: %d\n", __LINE__));
+
+       make_brs_info_100(inf);
+}
+
+/*******************************************************************
+ brs_reply_query_info
+ only supports info level 100 at the moment.
+
+ ********************************************************************/
+static void brs_reply_query_info(BRS_Q_QUERY_INFO *q_u,
+                               prs_struct *rdata,
+                               int status)
+{
+       BRS_R_QUERY_INFO r_u;
+       BRS_INFO_100 brs100;
+
+       DEBUG(5,("brs_query_info: %d\n", __LINE__));
+
+       create_brs_info_100(&brs100);
+       make_brs_r_query_info(&r_u, q_u->switch_value1, &brs100, status);
+
+       /* store the response in the SMB stream */
+       brs_io_r_query_info("", &r_u, rdata, 0);
+
+       DEBUG(5,("brs_query_info: %d\n", __LINE__));
+}
+
+/*******************************************************************
+ api_brs_query_info
+ ********************************************************************/
+static void api_brs_query_info( pipes_struct *p, prs_struct *data,
+                                    prs_struct *rdata )
+{
+       BRS_Q_QUERY_INFO q_u;
+
+       /* grab the net share enum */
+       brs_io_q_query_info("", &q_u, data, 0);
+
+       /* construct reply.  always indicate success */
+       brs_reply_query_info(&q_u, rdata, 0x0);
+}
+
+
+/*******************************************************************
+ \PIPE\brssvc commands
+ ********************************************************************/
+struct api_struct api_brs_cmds[] =
+{
+       { "BRS_Q_QUERY_INFO", BRS_QUERY_INFO, api_brs_query_info },
+       { NULL             , 0            , NULL }
+};
+
+/*******************************************************************
+ receives a browser pipe and responds.
+ ********************************************************************/
+BOOL api_brs_rpc(pipes_struct *p, prs_struct *data)
+{
+       return api_rpcTNP(p, "api_brssvc_rpc", api_brs_cmds, data);
+}
+
index c6d9cf070e5baab1bd2a12e6bb3404c5391c8863..075c9b0d37f3fdbd986fd45726ab2830684cf7a5 100644 (file)
@@ -402,6 +402,7 @@ static struct api_cmd api_fd_commands[] =
     { "samr",     "lsass",   api_samr_rpc },
     { "srvsvc",   "ntsvcs",  api_srvsvc_rpc },
     { "wkssvc",   "ntsvcs",  api_wkssvc_rpc },
+    { "browser",  "ntsvcs",  api_brs_rpc },
     { "svcctl",   "ntsvcs",  api_svcctl_rpc },
     { "NETLOGON", "lsass",   api_netlog_rpc },
     { "winreg",   "winreg",  api_reg_rpc },
index ac688a5baa3ba7495e6f861bd690d264f0adf942..70023e240764c98e9083b0fcf05a09cfc8aad7f4 100644 (file)
@@ -40,6 +40,7 @@ static char *known_nt_pipes[] = {
   "\\svcctl",
   "\\samr",
   "\\wkssvc",
+  "\\browser",
   "\\NETLOGON",
   "\\ntlsa",
   "\\ntsvcs",