summaryrefslogtreecommitdiff
path: root/source3/winbindd/winbindd_rpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/winbindd/winbindd_rpc.c')
-rw-r--r--source3/winbindd/winbindd_rpc.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/source3/winbindd/winbindd_rpc.c b/source3/winbindd/winbindd_rpc.c
index a87f368d90..05638244ec 100644
--- a/source3/winbindd/winbindd_rpc.c
+++ b/source3/winbindd/winbindd_rpc.c
@@ -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;
+}