s3-winbind: Added a common rpc_trusted_domains function.
authorAndreas Schneider <asn@samba.org>
Mon, 21 Jun 2010 09:13:25 +0000 (11:13 +0200)
committerAndreas Schneider <asn@samba.org>
Mon, 5 Jul 2010 13:59:14 +0000 (15:59 +0200)
source3/winbindd/winbindd_rpc.c
source3/winbindd/winbindd_rpc.h

index 05638244ec242d3a7c4afc8f03e1333a4d5d1e14..785e01319e4e8136d5de1a212f1df70eaeaa8936 100644 (file)
@@ -832,3 +832,72 @@ seq_num:
 
        return status;
 }
+
+/* Get a list of trusted domains */
+NTSTATUS rpc_trusted_domains(TALLOC_CTX *mem_ctx,
+                            struct rpc_pipe_client *lsa_pipe,
+                            struct policy_handle *lsa_policy,
+                            uint32_t *pnum_trusts,
+                            struct netr_DomainTrust **ptrusts)
+{
+       struct netr_DomainTrust *array = NULL;
+       uint32_t enum_ctx = 0;
+       uint32_t count = 0;
+       NTSTATUS status;
+
+       do {
+               struct lsa_DomainList dom_list;
+               uint32_t start_idx;
+               uint32_t i;
+
+               /*
+                * We don't run into deadlocks here, cause winbind_off() is
+                * called in the main function.
+                */
+               status = rpccli_lsa_EnumTrustDom(lsa_pipe,
+                                                mem_ctx,
+                                                lsa_policy,
+                                                &enum_ctx,
+                                                &dom_list,
+                                                (uint32_t) -1);
+               if (!NT_STATUS_IS_OK(status)) {
+                       if (!NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
+                               return status;
+                       }
+               }
+
+               start_idx = count;
+               count += dom_list.count;
+
+               array = talloc_realloc(mem_ctx,
+                                      array,
+                                      struct netr_DomainTrust,
+                                      count);
+               if (array == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               for (i = 0; i < dom_list.count; i++) {
+                       struct netr_DomainTrust *trust = &array[i];
+                       struct dom_sid *sid;
+
+                       ZERO_STRUCTP(trust);
+
+                       trust->netbios_name = talloc_move(array,
+                                                         &dom_list.domains[i].name.string);
+                       trust->dns_name = NULL;
+
+                       sid = talloc(array, struct dom_sid);
+                       if (sid == NULL) {
+                               return NT_STATUS_NO_MEMORY;
+                       }
+                       sid_copy(sid, dom_list.domains[i].sid);
+                       trust->sid = sid;
+               }
+       } while (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES));
+
+       *pnum_trusts = count;
+       *ptrusts = array;
+
+       return NT_STATUS_OK;
+}
index fb1abd05759395fbc4c744273dc35b6fe86e5137..42405df6e02f5c1da3d37643f72acabc566d48ca 100644 (file)
@@ -124,4 +124,11 @@ NTSTATUS rpc_sequence_number(TALLOC_CTX *mem_ctx,
                             const char *domain_name,
                             uint32_t *pseq);
 
+/* Get a list of trusted domains */
+NTSTATUS rpc_trusted_domains(TALLOC_CTX *mem_ctx,
+                            struct rpc_pipe_client *lsa_pipe,
+                            struct policy_handle *lsa_policy,
+                            uint32_t *pnum_trusts,
+                            struct netr_DomainTrust **ptrusts);
+
 #endif /* _WINBINDD_RPC_H_ */