Ignore:
Timestamp:
Nov 29, 2012, 1:59:04 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/source3/utils/net_rpc.c

    r745 r751  
    49034903}
    49044904
    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 
    49274905/**
    49284906 * List shares on a remote RPC server, including the security descriptors.
     
    49504928                                                const char **argv)
    49514929{
    4952         int ret;
    49534930        bool r;
    4954         uint32 i;
    49554931        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;
    49564941
    49574942        struct user_token *tokens = NULL;
    49584943        int num_tokens = 0;
    4959 
    4960         struct share_list share_list;
    49614944
    49624945        if (argc == 0) {
     
    49844967                collect_alias_memberships(&tokens[i].token);
    49854968
    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) {
    50015008                        continue;
     5009                }
    50025010
    50035011                d_printf("%s\n", netname);
     
    50115019        }
    50125020        SAFE_FREE(tokens);
    5013         SAFE_FREE(share_list.shares);
    5014 
    5015         return NT_STATUS_OK;
     5021
     5022        return nt_status;
    50165023}
    50175024
Note: See TracChangeset for help on using the changeset viewer.