r15630: adapt smbclient fix to smbtree to enable long share names
authorJim McDonough <jmcd@samba.org>
Tue, 16 May 2006 01:21:16 +0000 (01:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:17:03 +0000 (11:17 -0500)
(This used to be commit ae56154fc7694042496a55d4dade8ef1a7ba361c)

source3/Makefile.in
source3/utils/smbtree.c

index 32243b47597822b6b331c930305999908d5c509a..fc6daa381b0fc5910388f93d3c5efde7c23c806e 100644 (file)
@@ -477,7 +477,10 @@ SMBCONTROL_OBJ = utils/smbcontrol.o $(LOCKING_OBJ) $(PARAM_OBJ) \
 
 SMBTREE_OBJ = utils/smbtree.o $(PARAM_OBJ) \
              $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_OBJ) \
-            $(KRBCLIENT_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) 
+            $(KRBCLIENT_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) \
+             rpc_client/cli_srvsvc.o rpc_parse/parse_srv.o  \
+             rpc_client/cli_pipe.o rpc_parse/parse_rpc.o \
+             rpc_client/cli_netlogon.o rpc_parse/parse_net.o
 
 TESTPARM_OBJ = utils/testparm.o \
                $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
index 853a46f379e6bac598465840baea264e2e8b4dd6..d9cd446f6cb976233c8e7680df79e4ff4ac77056 100644 (file)
@@ -127,6 +127,60 @@ static BOOL get_servers(char *workgroup, struct user_auth_info *user_info)
         return True;
 }
 
+static BOOL get_rpc_shares(struct cli_state *cli, 
+                          void (*fn)(const char *, uint32, const char *, void *),
+                          void *state)
+{
+       NTSTATUS status;
+       struct rpc_pipe_client *pipe_hnd;
+       TALLOC_CTX *mem_ctx;
+       ENUM_HND enum_hnd;
+       WERROR werr;
+       SRV_SHARE_INFO_CTR ctr;
+       int i;
+
+       mem_ctx = talloc_new(NULL);
+       if (mem_ctx == NULL) {
+               DEBUG(0, ("talloc_new failed\n"));
+               return False;
+       }
+
+       init_enum_hnd(&enum_hnd, 0);
+
+       pipe_hnd = cli_rpc_pipe_open_noauth(cli, PI_SRVSVC, &status);
+
+       if (pipe_hnd == NULL) {
+               DEBUG(10, ("Could not connect to srvsvc pipe: %s\n",
+                          nt_errstr(status)));
+               TALLOC_FREE(mem_ctx);
+               return False;
+       }
+
+       werr = rpccli_srvsvc_net_share_enum(pipe_hnd, mem_ctx, 1, &ctr,
+                                           0xffffffff, &enum_hnd);
+
+       if (!W_ERROR_IS_OK(werr)) {
+               TALLOC_FREE(mem_ctx);
+               cli_rpc_pipe_close(pipe_hnd);
+               return False;
+       }
+
+       for (i=0; i<ctr.num_entries; i++) {
+               SRV_SHARE_INFO_1 *info = &ctr.share.info1[i];
+               char *name, *comment;
+               name = rpcstr_pull_unistr2_talloc(
+                       mem_ctx, &info->info_1_str.uni_netname);
+               comment = rpcstr_pull_unistr2_talloc(
+                       mem_ctx, &info->info_1_str.uni_remark);
+               fn(name, info->info_1.type, comment, state);
+       }
+
+       TALLOC_FREE(mem_ctx);
+       cli_rpc_pipe_close(pipe_hnd);
+       return True;
+}
+
+
 static BOOL get_shares(char *server_name, struct user_auth_info *user_info)
 {
         struct cli_state *cli;
@@ -134,6 +188,9 @@ static BOOL get_shares(char *server_name, struct user_auth_info *user_info)
         if (!(cli = get_ipc_connect(server_name, NULL, user_info)))
                 return False;
 
+       if (get_rpc_shares(cli, add_name, &shares))
+               return True;
+       
         if (!cli_RNetShareEnum(cli, add_name, &shares))
                 return False;