diff options
-rw-r--r-- | source3/winbindd/winbindd_msrpc.c | 91 |
1 files changed, 35 insertions, 56 deletions
diff --git a/source3/winbindd/winbindd_msrpc.c b/source3/winbindd/winbindd_msrpc.c index b7476b6ebd..2fbfd21c4a 100644 --- a/source3/winbindd/winbindd_msrpc.c +++ b/source3/winbindd/winbindd_msrpc.c @@ -890,70 +890,49 @@ done: } /* get a list of trusted domains */ -static NTSTATUS trusted_domains(struct winbindd_domain *domain, - TALLOC_CTX *mem_ctx, - struct netr_DomainTrustList *trusts) +static NTSTATUS msrpc_trusted_domains(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, + struct netr_DomainTrustList *ptrust_list) { - NTSTATUS result = NT_STATUS_UNSUCCESSFUL; - uint32 enum_ctx = 0; - struct rpc_pipe_client *cli; + struct rpc_pipe_client *lsa_pipe; struct policy_handle lsa_policy; + struct netr_DomainTrust *trusts = NULL; + uint32_t num_trusts = 0; + TALLOC_CTX *tmp_ctx; + NTSTATUS status; - DEBUG(3,("rpc: trusted_domains\n")); - - ZERO_STRUCTP(trusts); - - result = cm_connect_lsa(domain, mem_ctx, &cli, &lsa_policy); - if (!NT_STATUS_IS_OK(result)) - return result; - - result = STATUS_MORE_ENTRIES; - - while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) { - uint32 start_idx; - int i; - struct lsa_DomainList dom_list; - - result = rpccli_lsa_EnumTrustDom(cli, mem_ctx, - &lsa_policy, - &enum_ctx, - &dom_list, - (uint32_t)-1); - - if (!NT_STATUS_IS_OK(result) && - !NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) - break; - - start_idx = trusts->count; - trusts->count += dom_list.count; + DEBUG(3,("samr: trusted domains\n")); - trusts->array = talloc_realloc( - mem_ctx, trusts->array, struct netr_DomainTrust, - trusts->count); - if (trusts->array == NULL) { - return NT_STATUS_NO_MEMORY; - } + if (ptrust_list) { + ZERO_STRUCTP(ptrust_list); + } - for (i=0; i<dom_list.count; i++) { - struct netr_DomainTrust *trust = &trusts->array[i]; - struct dom_sid *sid; + tmp_ctx = talloc_stackframe(); + if (tmp_ctx == NULL) { + return NT_STATUS_NO_MEMORY; + } - ZERO_STRUCTP(trust); + status = cm_connect_lsa(domain, tmp_ctx, &lsa_pipe, &lsa_policy); + if (!NT_STATUS_IS_OK(status)) + return status; - trust->netbios_name = talloc_move( - trusts->array, - &dom_list.domains[i].name.string); - trust->dns_name = NULL; + status = rpc_trusted_domains(tmp_ctx, + lsa_pipe, + &lsa_policy, + &num_trusts, + &trusts); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } - sid = talloc(trusts->array, struct dom_sid); - if (sid == NULL) { - return NT_STATUS_NO_MEMORY; - } - sid_copy(sid, dom_list.domains[i].sid); - trust->sid = sid; - } + if (ptrust_list) { + ptrust_list->count = num_trusts; + ptrust_list->array = talloc_move(mem_ctx, &trusts); } - return result; + +done: + TALLOC_FREE(tmp_ctx); + return status; } /* find the lockout policy for a domain */ @@ -1185,5 +1164,5 @@ struct winbindd_methods msrpc_methods = { msrpc_sequence_number, msrpc_lockout_policy, msrpc_password_policy, - trusted_domains, + msrpc_trusted_domains, }; |