s4-samr: merge samr_QueryDisplayInfo from s3 idl. (fixme: python)
authorGünther Deschner <gd@samba.org>
Wed, 5 Nov 2008 11:32:24 +0000 (12:32 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 10 Nov 2008 20:46:29 +0000 (21:46 +0100)
Guenther

librpc/idl/samr.idl
source4/rpc_server/samr/dcesrv_samr.c
source4/torture/rpc/samr.c

index aa72c546a8f7eced85620e627f9152e7c3c90ff6..f5e069b74b014bdf99d710624516a9c745dd8e8b 100644 (file)
@@ -1118,9 +1118,9 @@ import "misc.idl", "lsa.idl", "security.idl";
                [in]        uint32 start_idx,
                [in]        uint32 max_entries,
                [in]        uint32 buf_size,
-               [out]       uint32 total_size,
-               [out]       uint32 returned_size,
-               [out,switch_is(level)] samr_DispInfo info
+               [out,ref]   uint32 *total_size,
+               [out,ref]   uint32 *returned_size,
+               [out,ref,switch_is(level)] samr_DispInfo *info
                );
 
 
index b81559bfcf228eeba3c8d76d02cd635bc0876c4f..fe001c30eff254690e6d2810dbb15237a1e96de8 100644 (file)
@@ -3829,65 +3829,65 @@ static NTSTATUS dcesrv_samr_QueryDisplayInfo(struct dcesrv_call_state *dce_call,
                count += 1;
        }
 
-       r->out.total_size = count;
+       *r->out.total_size = count;
 
        if (r->in.start_idx >= count) {
-               r->out.returned_size = 0;
+               *r->out.returned_size = 0;
                switch(r->in.level) {
                case 1:
-                       r->out.info.info1.count = r->out.returned_size;
-                       r->out.info.info1.entries = NULL;
+                       r->out.info->info1.count = *r->out.returned_size;
+                       r->out.info->info1.entries = NULL;
                        break;
                case 2:
-                       r->out.info.info2.count = r->out.returned_size;
-                       r->out.info.info2.entries = NULL;
+                       r->out.info->info2.count = *r->out.returned_size;
+                       r->out.info->info2.entries = NULL;
                        break;
                case 3:
-                       r->out.info.info3.count = r->out.returned_size;
-                       r->out.info.info3.entries = NULL;
+                       r->out.info->info3.count = *r->out.returned_size;
+                       r->out.info->info3.entries = NULL;
                        break;
                case 4:
-                       r->out.info.info4.count = r->out.returned_size;
-                       r->out.info.info4.entries = NULL;
+                       r->out.info->info4.count = *r->out.returned_size;
+                       r->out.info->info4.entries = NULL;
                        break;
                case 5:
-                       r->out.info.info5.count = r->out.returned_size;
-                       r->out.info.info5.entries = NULL;
+                       r->out.info->info5.count = *r->out.returned_size;
+                       r->out.info->info5.entries = NULL;
                        break;
                }
        } else {
-               r->out.returned_size = MIN(count - r->in.start_idx,
+               *r->out.returned_size = MIN(count - r->in.start_idx,
                                           r->in.max_entries);
                switch(r->in.level) {
                case 1:
-                       r->out.info.info1.count = r->out.returned_size;
-                       r->out.info.info1.entries =
+                       r->out.info->info1.count = *r->out.returned_size;
+                       r->out.info->info1.entries =
                                &(entriesGeneral[r->in.start_idx]);
                        break;
                case 2:
-                       r->out.info.info2.count = r->out.returned_size;
-                       r->out.info.info2.entries =
+                       r->out.info->info2.count = *r->out.returned_size;
+                       r->out.info->info2.entries =
                                &(entriesFull[r->in.start_idx]);
                        break;
                case 3:
-                       r->out.info.info3.count = r->out.returned_size;
-                       r->out.info.info3.entries =
+                       r->out.info->info3.count = *r->out.returned_size;
+                       r->out.info->info3.entries =
                                &(entriesFullGroup[r->in.start_idx]);
                        break;
                case 4:
-                       r->out.info.info4.count = r->out.returned_size;
-                       r->out.info.info4.entries =
+                       r->out.info->info4.count = *r->out.returned_size;
+                       r->out.info->info4.entries =
                                &(entriesAscii[r->in.start_idx]);
                        break;
                case 5:
-                       r->out.info.info5.count = r->out.returned_size;
-                       r->out.info.info5.entries =
+                       r->out.info->info5.count = *r->out.returned_size;
+                       r->out.info->info5.entries =
                                &(entriesAscii[r->in.start_idx]);
                        break;
                }
        }
 
-       return (r->out.returned_size < (count - r->in.start_idx)) ?
+       return (*r->out.returned_size < (count - r->in.start_idx)) ?
                STATUS_MORE_ENTRIES : NT_STATUS_OK;
 }
 
@@ -4074,14 +4074,12 @@ static NTSTATUS dcesrv_samr_QueryDisplayInfo2(struct dcesrv_call_state *dce_call
        q.in.start_idx = r->in.start_idx;
        q.in.max_entries = r->in.max_entries;
        q.in.buf_size = r->in.buf_size;
-       ZERO_STRUCT(q.out);
+       q.out.total_size = r->out.total_size;
+       q.out.returned_size = r->out.returned_size;
+       q.out.info = r->out.info;
 
        result = dcesrv_samr_QueryDisplayInfo(dce_call, mem_ctx, &q);
 
-       *r->out.total_size = q.out.total_size;
-       *r->out.returned_size = q.out.returned_size;
-       *r->out.info = q.out.info;
-
        return result;
 }
 
@@ -4110,14 +4108,12 @@ static NTSTATUS dcesrv_samr_QueryDisplayInfo3(struct dcesrv_call_state *dce_call
        q.in.start_idx = r->in.start_idx;
        q.in.max_entries = r->in.max_entries;
        q.in.buf_size = r->in.buf_size;
-       ZERO_STRUCT(q.out);
+       q.out.total_size = r->out.total_size;
+       q.out.returned_size = r->out.returned_size;
+       q.out.info = r->out.info;
 
        result = dcesrv_samr_QueryDisplayInfo(dce_call, mem_ctx, &q);
 
-       *r->out.total_size = q.out.total_size;
-       *r->out.returned_size = q.out.returned_size;
-       *r->out.info = q.out.info;
-
        return result;
 }
 
index 8444ac3820601d1c47a59de53873cb6775ac8efa..17e81a93e014636e553b8e5dde11417cc3f81cf3 100644 (file)
@@ -3605,16 +3605,16 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
        for (i = 0; ; i++) {
                switch (querydisplayinfo->in.level) {
                case 1:
-                       if (i >= querydisplayinfo->out.info.info1.count) {
+                       if (i >= querydisplayinfo->out.info->info1.count) {
                                return ret;
                        }
-                       r.in.rid = querydisplayinfo->out.info.info1.entries[i].rid;
+                       r.in.rid = querydisplayinfo->out.info->info1.entries[i].rid;
                        break;
                case 2:
-                       if (i >= querydisplayinfo->out.info.info2.count) {
+                       if (i >= querydisplayinfo->out.info->info2.count) {
                                return ret;
                        }
-                       r.in.rid = querydisplayinfo->out.info.info2.entries[i].rid;
+                       r.in.rid = querydisplayinfo->out.info->info2.entries[i].rid;
                        break;
                case 3:
                        /* Groups */
@@ -3649,29 +3649,29 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
                        if (seen_testuser && strcmp(q.out.info->info21.account_name.string, TEST_ACCOUNT_NAME) == 0) {
                                *seen_testuser = true;
                        }
-                       STRING_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].full_name, 
+                       STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].full_name,
                                           q.out.info->info21.full_name, q.out.info->info21.account_name);
-                       STRING_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].account_name, 
+                       STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].account_name,
                                           q.out.info->info21.account_name, q.out.info->info21.account_name);
-                       STRING_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].description, 
+                       STRING_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].description,
                                           q.out.info->info21.description, q.out.info->info21.account_name);
-                       INT_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].rid, 
+                       INT_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].rid,
                                        q.out.info->info21.rid, q.out.info->info21.account_name);
-                       INT_EQUAL_QUERY(querydisplayinfo->out.info.info1.entries[i].acct_flags, 
+                       INT_EQUAL_QUERY(querydisplayinfo->out.info->info1.entries[i].acct_flags,
                                        q.out.info->info21.acct_flags, q.out.info->info21.account_name);
                        
                        break;
                case 2:
-                       STRING_EQUAL_QUERY(querydisplayinfo->out.info.info2.entries[i].account_name, 
+                       STRING_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].account_name,
                                           q.out.info->info21.account_name, q.out.info->info21.account_name);
-                       STRING_EQUAL_QUERY(querydisplayinfo->out.info.info2.entries[i].description, 
+                       STRING_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].description,
                                           q.out.info->info21.description, q.out.info->info21.account_name);
-                       INT_EQUAL_QUERY(querydisplayinfo->out.info.info2.entries[i].rid, 
+                       INT_EQUAL_QUERY(querydisplayinfo->out.info->info2.entries[i].rid,
                                        q.out.info->info21.rid, q.out.info->info21.account_name);
-                       INT_EQUAL_QUERY((querydisplayinfo->out.info.info2.entries[i].acct_flags & ~ACB_NORMAL), 
+                       INT_EQUAL_QUERY((querydisplayinfo->out.info->info2.entries[i].acct_flags & ~ACB_NORMAL),
                                        q.out.info->info21.acct_flags, q.out.info->info21.account_name);
                        
-                       if (!(querydisplayinfo->out.info.info2.entries[i].acct_flags & ACB_NORMAL)) {
+                       if (!(querydisplayinfo->out.info->info2.entries[i].acct_flags & ACB_NORMAL)) {
                                printf("Missing ACB_NORMAL in querydisplayinfo->out.info.info2.entries[i].acct_flags on %s\n", 
                                       q.out.info->info21.account_name.string);
                        }
@@ -3679,7 +3679,7 @@ static bool test_each_DisplayInfo_user(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct
                        if (!(q.out.info->info21.acct_flags & (ACB_WSTRUST | ACB_SVRTRUST))) {
                                printf("Found non-trust account %s in trust account listing: 0x%x 0x%x\n",
                                       q.out.info->info21.account_name.string,
-                                      querydisplayinfo->out.info.info2.entries[i].acct_flags,
+                                      querydisplayinfo->out.info->info2.entries[i].acct_flags,
                                       q.out.info->info21.acct_flags);
                                return false;
                        }
@@ -3705,6 +3705,10 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        uint16_t levels[] = {1, 2, 3, 4, 5};
        int i;
        bool seen_testuser = false;
+       uint32_t total_size;
+       uint32_t returned_size;
+       union samr_DispInfo disp_info;
+
 
        for (i=0;i<ARRAY_SIZE(levels);i++) {
                printf("Testing QueryDisplayInfo level %u\n", levels[i]);
@@ -3716,6 +3720,9 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                        r.in.level = levels[i];
                        r.in.max_entries = 2;
                        r.in.buf_size = (uint32_t)-1;
+                       r.out.total_size = &total_size;
+                       r.out.returned_size = &returned_size;
+                       r.out.info = &disp_info;
                        
                        status = dcerpc_samr_QueryDisplayInfo(p, mem_ctx, &r);
                        if (!NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES) && !NT_STATUS_IS_OK(status)) {
@@ -3728,22 +3735,22 @@ static bool test_QueryDisplayInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                                if (!test_each_DisplayInfo_user(p, mem_ctx, &r, &seen_testuser)) {
                                        ret = false;
                                }
-                               r.in.start_idx += r.out.info.info1.count;
+                               r.in.start_idx += r.out.info->info1.count;
                                break;
                        case 2:
                                if (!test_each_DisplayInfo_user(p, mem_ctx, &r, NULL)) {
                                        ret = false;
                                }
-                               r.in.start_idx += r.out.info.info2.count;
+                               r.in.start_idx += r.out.info->info2.count;
                                break;
                        case 3:
-                               r.in.start_idx += r.out.info.info3.count;
+                               r.in.start_idx += r.out.info->info3.count;
                                break;
                        case 4:
-                               r.in.start_idx += r.out.info.info4.count;
+                               r.in.start_idx += r.out.info->info4.count;
                                break;
                        case 5:
-                               r.in.start_idx += r.out.info.info5.count;
+                               r.in.start_idx += r.out.info->info5.count;
                                break;
                        }
                }
@@ -3872,6 +3879,9 @@ static bool test_QueryDisplayInfo_continue(struct dcerpc_pipe *p, TALLOC_CTX *me
        NTSTATUS status;
        struct samr_QueryDisplayInfo r;
        bool ret = true;
+       uint32_t total_size;
+       uint32_t returned_size;
+       union samr_DispInfo info;
 
        printf("Testing QueryDisplayInfo continuation\n");
 
@@ -3880,14 +3890,17 @@ static bool test_QueryDisplayInfo_continue(struct dcerpc_pipe *p, TALLOC_CTX *me
        r.in.start_idx = 0;
        r.in.max_entries = 1;
        r.in.buf_size = (uint32_t)-1;
+       r.out.total_size = &total_size;
+       r.out.returned_size = &returned_size;
+       r.out.info = &info;
 
        do {
                status = dcerpc_samr_QueryDisplayInfo(p, mem_ctx, &r);
-               if (NT_STATUS_IS_OK(status) && r.out.returned_size != 0) {
-                       if (r.out.info.info1.entries[0].idx != r.in.start_idx + 1) {
+               if (NT_STATUS_IS_OK(status) && *r.out.returned_size != 0) {
+                       if (r.out.info->info1.entries[0].idx != r.in.start_idx + 1) {
                                printf("expected idx %d but got %d\n",
                                       r.in.start_idx + 1,
-                                      r.out.info.info1.entries[0].idx);
+                                      r.out.info->info1.entries[0].idx);
                                break;
                        }
                }
@@ -3901,7 +3914,7 @@ static bool test_QueryDisplayInfo_continue(struct dcerpc_pipe *p, TALLOC_CTX *me
                r.in.start_idx++;
        } while ((NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES) ||
                  NT_STATUS_IS_OK(status)) &&
-                r.out.returned_size != 0);
+                *r.out.returned_size != 0);
        
        return ret;     
 }
@@ -4065,6 +4078,9 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
        uint32_t resume_handle=0;
        int i;
        bool ret = true;
+       uint32_t total_size;
+       uint32_t returned_size;
+       union samr_DispInfo info;
 
        int num_names = 0;
        const char **names = NULL;
@@ -4100,6 +4116,9 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
        q2.in.start_idx = 0;
        q2.in.max_entries = 5;
        q2.in.buf_size = (uint32_t)-1;
+       q2.out.total_size = &total_size;
+       q2.out.returned_size = &returned_size;
+       q2.out.info = &info;
 
        status = STATUS_MORE_ENTRIES;
        while (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
@@ -4109,9 +4128,9 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
                    !NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES))
                        break;
 
-               for (i=0; i<q2.out.info.info5.count; i++) {
+               for (i=0; i<q2.out.info->info5.count; i++) {
                        int j;
-                       const char *name = q2.out.info.info5.entries[i].account_name.string;
+                       const char *name = q2.out.info->info5.entries[i].account_name.string;
                        bool found = false;
                        for (j=0; j<num_names; j++) {
                                if (names[j] == NULL)
@@ -4129,7 +4148,7 @@ static bool test_GroupList(struct dcerpc_pipe *p, struct torture_context *tctx,
                                ret = false;
                        }
                }
-               q2.in.start_idx += q2.out.info.info5.count;
+               q2.in.start_idx += q2.out.info->info5.count;
        }
 
        if (!NT_STATUS_IS_OK(status)) {