summaryrefslogtreecommitdiff
path: root/source4/libcli/ndr
diff options
context:
space:
mode:
Diffstat (limited to 'source4/libcli/ndr')
-rw-r--r--source4/libcli/ndr/ndr_lsa.c45
-rw-r--r--source4/libcli/ndr/ndr_lsa.h13
-rw-r--r--source4/libcli/ndr/ndr_sec.c10
3 files changed, 68 insertions, 0 deletions
diff --git a/source4/libcli/ndr/ndr_lsa.c b/source4/libcli/ndr/ndr_lsa.c
index 5955432915..dfe978f9d4 100644
--- a/source4/libcli/ndr/ndr_lsa.c
+++ b/source4/libcli/ndr/ndr_lsa.c
@@ -108,3 +108,48 @@ NTSTATUS ndr_pull_lsa_OpenPolicy2(struct ndr_pull *ndr,
NDR_CHECK(ndr_pull_status(ndr, &r->out.status));
return NT_STATUS_OK;
}
+
+
+/*
+ push a EnumSids
+*/
+NTSTATUS ndr_push_lsa_EnumSids(struct ndr_push *ndr,
+ struct lsa_EnumSids *r)
+{
+ NDR_CHECK(ndr_push_policy_handle(ndr, r->in.handle));
+ NDR_CHECK(ndr_push_u32(ndr, r->in.start_at));
+ NDR_CHECK(ndr_push_u32(ndr, r->in.num_entries));
+ return NT_STATUS_OK;
+}
+
+/*
+ pull a EnumSids
+*/
+NTSTATUS ndr_pull_lsa_EnumSids(struct ndr_pull *ndr,
+ struct lsa_EnumSids *r)
+{
+ uint32 nptrs, asize, i, ptr;
+
+ NDR_CHECK(ndr_pull_u32(ndr, &r->out.num_entries));
+ NDR_CHECK(ndr_pull_u32(ndr, &nptrs));
+ NDR_CHECK(ndr_pull_u32(ndr, &ptr));
+ if (!ptr) goto done;
+
+ NDR_CHECK(ndr_pull_u32(ndr, &asize));
+ NDR_ALLOC_N(ndr, r->out.sids, nptrs);
+ for (i=0;i<nptrs;i++) {
+ NDR_CHECK(ndr_pull_u32(ndr, &ptr));
+ if (ptr) {
+ NDR_ALLOC(ndr, r->out.sids[i]);
+ } else {
+ r->out.sids[i] = NULL;
+ }
+ }
+ for (i=0;i<nptrs;i++) {
+ if (r->out.sids[i]) NDR_CHECK(ndr_pull_dom_sid2(ndr, r->out.sids[i]));
+ }
+
+done:
+ NDR_CHECK(ndr_pull_status(ndr, &r->out.status));
+ return NT_STATUS_OK;
+}
diff --git a/source4/libcli/ndr/ndr_lsa.h b/source4/libcli/ndr/ndr_lsa.h
index cfdd98e24e..0cc43b5f86 100644
--- a/source4/libcli/ndr/ndr_lsa.h
+++ b/source4/libcli/ndr/ndr_lsa.h
@@ -57,3 +57,16 @@ struct lsa_OpenPolicy2 {
NTSTATUS status;
} out;
};
+
+struct lsa_EnumSids {
+ struct {
+ struct policy_handle *handle;
+ uint32 start_at;
+ uint32 num_entries;
+ } in;
+ struct {
+ uint32 num_entries;
+ struct dom_sid **sids;
+ NTSTATUS status;
+ } out;
+};
diff --git a/source4/libcli/ndr/ndr_sec.c b/source4/libcli/ndr/ndr_sec.c
index 6b83a09d7a..52578089e6 100644
--- a/source4/libcli/ndr/ndr_sec.c
+++ b/source4/libcli/ndr/ndr_sec.c
@@ -137,6 +137,16 @@ NTSTATUS ndr_pull_dom_sid(struct ndr_pull *ndr, struct dom_sid *sid)
}
/*
+ parse a dom_sid2 - this is a dom_sid but with an extra copy of the num_auths field
+*/
+NTSTATUS ndr_pull_dom_sid2(struct ndr_pull *ndr, struct dom_sid *sid)
+{
+ uint32 num_auths;
+ NDR_CHECK(ndr_pull_u32(ndr, &num_auths));
+ return ndr_pull_dom_sid(ndr, sid);
+}
+
+/*
parse a dom_sid offset and structure
*/
NTSTATUS ndr_pull_dom_sid_ofs(struct ndr_pull *ndr, struct dom_sid **sid)