Changeset 751 for trunk/server/source3/utils/net_rpc.c
- Timestamp:
- Nov 29, 2012, 1:59:04 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/utils/net_rpc.c
r745 r751 4903 4903 } 4904 4904 4905 struct share_list {4906 int num_shares;4907 char **shares;4908 };4909 4910 static void collect_share(const char *name, uint32 m,4911 const char *comment, void *state)4912 {4913 struct share_list *share_list = (struct share_list *)state;4914 4915 if (m != STYPE_DISKTREE)4916 return;4917 4918 share_list->num_shares += 1;4919 share_list->shares = SMB_REALLOC_ARRAY(share_list->shares, char *, share_list->num_shares);4920 if (!share_list->shares) {4921 share_list->num_shares = 0;4922 return;4923 }4924 share_list->shares[share_list->num_shares-1] = SMB_STRDUP(name);4925 }4926 4927 4905 /** 4928 4906 * List shares on a remote RPC server, including the security descriptors. … … 4950 4928 const char **argv) 4951 4929 { 4952 int ret;4953 4930 bool r; 4954 uint32 i;4955 4931 FILE *f; 4932 NTSTATUS nt_status = NT_STATUS_OK; 4933 uint32_t total_entries = 0; 4934 uint32_t resume_handle = 0; 4935 uint32_t preferred_len = 0xffffffff; 4936 uint32_t i; 4937 struct dcerpc_binding_handle *b = NULL; 4938 struct srvsvc_NetShareInfoCtr info_ctr; 4939 struct srvsvc_NetShareCtr1 ctr1; 4940 WERROR result; 4956 4941 4957 4942 struct user_token *tokens = NULL; 4958 4943 int num_tokens = 0; 4959 4960 struct share_list share_list;4961 4944 4962 4945 if (argc == 0) { … … 4984 4967 collect_alias_memberships(&tokens[i].token); 4985 4968 4986 share_list.num_shares = 0; 4987 share_list.shares = NULL; 4988 4989 ret = cli_RNetShareEnum(cli, collect_share, &share_list); 4990 4991 if (ret == -1) { 4992 DEBUG(0, ("Error returning browse list: %s\n", 4993 cli_errstr(cli))); 4994 goto done; 4995 } 4996 4997 for (i = 0; i < share_list.num_shares; i++) { 4998 char *netname = share_list.shares[i]; 4999 5000 if (netname[strlen(netname)-1] == '$') 4969 ZERO_STRUCT(info_ctr); 4970 ZERO_STRUCT(ctr1); 4971 4972 info_ctr.level = 1; 4973 info_ctr.ctr.ctr1 = &ctr1; 4974 4975 b = pipe_hnd->binding_handle; 4976 4977 /* Issue the NetShareEnum RPC call and retrieve the response */ 4978 nt_status = dcerpc_srvsvc_NetShareEnumAll(b, 4979 talloc_tos(), 4980 pipe_hnd->desthost, 4981 &info_ctr, 4982 preferred_len, 4983 &total_entries, 4984 &resume_handle, 4985 &result); 4986 4987 /* Was it successful? */ 4988 if (!NT_STATUS_IS_OK(nt_status)) { 4989 /* Nope. Go clean up. */ 4990 goto done; 4991 } 4992 4993 if (!W_ERROR_IS_OK(result)) { 4994 /* Nope. Go clean up. */ 4995 nt_status = werror_to_ntstatus(result); 4996 goto done; 4997 } 4998 4999 if (total_entries == 0) { 5000 goto done; 5001 } 5002 5003 /* For each returned entry... */ 5004 for (i = 0; i < info_ctr.ctr.ctr1->count; i++) { 5005 const char *netname = info_ctr.ctr.ctr1->array[i].name; 5006 5007 if (info_ctr.ctr.ctr1->array[i].type != STYPE_DISKTREE) { 5001 5008 continue; 5009 } 5002 5010 5003 5011 d_printf("%s\n", netname); … … 5011 5019 } 5012 5020 SAFE_FREE(tokens); 5013 SAFE_FREE(share_list.shares); 5014 5015 return NT_STATUS_OK; 5021 5022 return nt_status; 5016 5023 } 5017 5024
Note:
See TracChangeset
for help on using the changeset viewer.