s3-winbind: Added a common rpc_sequence_number function.
authorAndreas Schneider <asn@samba.org>
Mon, 21 Jun 2010 08:47:22 +0000 (10:47 +0200)
committerAndreas Schneider <asn@samba.org>
Mon, 5 Jul 2010 13:59:13 +0000 (15:59 +0200)
source3/winbindd/winbindd_rpc.c
source3/winbindd/winbindd_rpc.h

index a87f368d9098a755b9998d1721631b09eb3cab77..05638244ec242d3a7c4afc8f03e1333a4d5d1e14 100644 (file)
@@ -783,3 +783,52 @@ NTSTATUS rpc_lookup_groupmem(TALLOC_CTX *mem_ctx,
 
        return NT_STATUS_OK;
 }
+
+/* Find the sequence number for a domain */
+NTSTATUS rpc_sequence_number(TALLOC_CTX *mem_ctx,
+                            struct rpc_pipe_client *samr_pipe,
+                            struct policy_handle *samr_policy,
+                            const char *domain_name,
+                            uint32_t *pseq)
+{
+       union samr_DomainInfo *info = NULL;
+       bool got_seq_num = false;
+       NTSTATUS status;
+
+       /* query domain info */
+       status = rpccli_samr_QueryDomainInfo(samr_pipe,
+                                            mem_ctx,
+                                            samr_policy,
+                                            8,
+                                            &info);
+       if (NT_STATUS_IS_OK(status)) {
+               *pseq = info->info8.sequence_num;
+               got_seq_num = true;
+               goto seq_num;
+       }
+
+       /* retry with info-level 2 in case the dc does not support info-level 8
+        * (like all older samba2 and samba3 dc's) - Guenther */
+       status = rpccli_samr_QueryDomainInfo(samr_pipe,
+                                            mem_ctx,
+                                            samr_policy,
+                                            2,
+                                            &info);
+       if (NT_STATUS_IS_OK(status)) {
+               *pseq = info->general.sequence_num;
+               got_seq_num = true;
+       }
+
+seq_num:
+       if (got_seq_num) {
+               DEBUG(10,("domain_sequence_number: for domain %s is %u\n",
+                         domain_name, (unsigned) *pseq));
+       } else {
+               DEBUG(10,("domain_sequence_number: failed to get sequence "
+                         "number (%u) for domain %s\n",
+                         (unsigned) *pseq, domain_name ));
+               status = NT_STATUS_OK;
+       }
+
+       return status;
+}
index b31718747fbd918edd8c42db2ccc2db545a47730..fb1abd05759395fbc4c744273dc35b6fe86e5137 100644 (file)
@@ -117,4 +117,11 @@ NTSTATUS rpc_lookup_groupmem(TALLOC_CTX *mem_ctx,
                             char ***pnames,
                             uint32_t **pname_types);
 
+/* Find the sequence number for a domain */
+NTSTATUS rpc_sequence_number(TALLOC_CTX *mem_ctx,
+                            struct rpc_pipe_client *samr_pipe,
+                            struct policy_handle *samr_policy,
+                            const char *domain_name,
+                            uint32_t *pseq);
+
 #endif /* _WINBINDD_RPC_H_ */