Use pidl for _lsa_EnumAccounts.
authorGünther Deschner <gd@samba.org>
Thu, 14 Feb 2008 00:16:03 +0000 (01:16 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 14 Feb 2008 00:19:25 +0000 (01:19 +0100)
Guenther
(This used to be commit 07e5138ad960bce8569ea593ca9a1b4fbf2b1048)

source3/rpc_server/srv_lsa.c
source3/rpc_server/srv_lsa_nt.c

index f48a397f1ded149676085e894b424699e49d11ed..a3fe00cced743e8bfd90173cc16451021991c82e 100644 (file)
@@ -185,28 +185,7 @@ static bool api_lsa_priv_get_dispname(pipes_struct *p)
 
 static bool api_lsa_enum_accounts(pipes_struct *p)
 {
-       LSA_Q_ENUM_ACCOUNTS q_u;
-       LSA_R_ENUM_ACCOUNTS r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-
-       if(!lsa_io_q_enum_accounts("", &q_u, data, 0)) {
-               DEBUG(0,("api_lsa_enum_accounts: failed to unmarshall LSA_Q_ENUM_ACCOUNTS.\n"));
-               return False;
-       }
-
-       r_u.status = _lsa_enum_accounts(p, &q_u, &r_u);
-
-       /* store the response in the SMB stream */
-       if(!lsa_io_r_enum_accounts("", &r_u, rdata, 0)) {
-               DEBUG(0,("api_lsa_enum_accounts: Failed to marshall LSA_R_ENUM_ACCOUNTS.\n"));
-               return False;
-       }
-
-       return True;
+       return proxy_lsa_call(p, NDR_LSA_ENUMACCOUNTS);
 }
 
 /***************************************************************************
index 3cf83962eed60a0e052125c0c9f922f2228573d2..097b50504fe02d8063ad5d1f9156cfd1e4df1de6 100644 (file)
@@ -1519,18 +1519,19 @@ NTSTATUS _lsa_LookupPrivDisplayName(pipes_struct *p,
 }
 
 /***************************************************************************
-_lsa_enum_accounts.
+ _lsa_EnumAccounts
  ***************************************************************************/
 
-NTSTATUS _lsa_enum_accounts(pipes_struct *p, LSA_Q_ENUM_ACCOUNTS *q_u, LSA_R_ENUM_ACCOUNTS *r_u)
+NTSTATUS _lsa_EnumAccounts(pipes_struct *p,
+                          struct lsa_EnumAccounts *r)
 {
        struct lsa_info *handle;
        DOM_SID *sid_list;
        int i, j, num_entries;
-       LSA_SID_ENUM *sids=&r_u->sids;
-       NTSTATUS ret;
+       NTSTATUS status;
+       struct lsa_SidPtr *sids = NULL;
 
-       if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))
+       if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
                return NT_STATUS_INVALID_HANDLE;
 
        if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))
@@ -1542,34 +1543,37 @@ NTSTATUS _lsa_enum_accounts(pipes_struct *p, LSA_Q_ENUM_ACCOUNTS *q_u, LSA_R_ENU
        /* The only way we can currently find out all the SIDs that have been
           privileged is to scan all privileges */
 
-       if (!NT_STATUS_IS_OK(ret = privilege_enumerate_accounts(&sid_list, &num_entries))) {
-               return ret;
+       status = privilege_enumerate_accounts(&sid_list, &num_entries);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
        }
 
-       if (q_u->enum_context >= num_entries)
+       if (*r->in.resume_handle >= num_entries) {
                return NT_STATUS_NO_MORE_ENTRIES;
+       }
 
-       if (num_entries-q_u->enum_context) {
-               sids->ptr_sid = TALLOC_ZERO_ARRAY(p->mem_ctx, uint32, num_entries-q_u->enum_context);
-               sids->sid = TALLOC_ZERO_ARRAY(p->mem_ctx, DOM_SID2, num_entries-q_u->enum_context);
-
-               if (sids->ptr_sid==NULL || sids->sid==NULL) {
+       if (num_entries - *r->in.resume_handle) {
+               sids = TALLOC_ZERO_ARRAY(p->mem_ctx, struct lsa_SidPtr,
+                                        num_entries - *r->in.resume_handle);
+               if (!sids) {
                        SAFE_FREE(sid_list);
                        return NT_STATUS_NO_MEMORY;
                }
 
-               for (i = q_u->enum_context, j = 0; i < num_entries; i++, j++) {
-                       init_dom_sid2(&(*sids).sid[j], &sid_list[i]);
-                       (*sids).ptr_sid[j] = 1;
+               for (i = *r->in.resume_handle, j = 0; i < num_entries; i++, j++) {
+                       sids[j].sid = sid_dup_talloc(p->mem_ctx, &sid_list[i]);
+                       if (!sids[j].sid) {
+                               SAFE_FREE(sid_list);
+                               return NT_STATUS_NO_MEMORY;
+                       }
                }
-       } else {
-               sids->ptr_sid = NULL;
-               sids->sid = NULL;
        }
 
        talloc_free(sid_list);
 
-       init_lsa_r_enum_accounts(r_u, num_entries);
+       *r->out.resume_handle = num_entries;
+       r->out.sids->num_sids = num_entries;
+       r->out.sids->sids = sids;
 
        return NT_STATUS_OK;
 }
@@ -2230,12 +2234,6 @@ NTSTATUS _lsa_ClearAuditLog(pipes_struct *p, struct lsa_ClearAuditLog *r)
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS _lsa_EnumAccounts(pipes_struct *p, struct lsa_EnumAccounts *r)
-{
-       p->rng_fault_state = True;
-       return NT_STATUS_NOT_IMPLEMENTED;
-}
-
 NTSTATUS _lsa_LookupNames(pipes_struct *p, struct lsa_LookupNames *r)
 {
        p->rng_fault_state = True;