use [subcontext] to make GetPrinter a bit easier in smbtorture
authorAndrew Tridgell <tridge@samba.org>
Mon, 17 Nov 2003 09:34:19 +0000 (09:34 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 17 Nov 2003 09:34:19 +0000 (09:34 +0000)
(This used to be commit a5140985d8f57695b4165c72af217092da6fae5f)

source4/librpc/idl/echo.idl
source4/librpc/idl/spoolss.idl
source4/librpc/ndr/ndr.c
source4/librpc/ndr/ndr_echo.c
source4/librpc/ndr/ndr_echo.h
source4/librpc/ndr/ndr_spoolss.c
source4/librpc/ndr/ndr_spoolss.h
source4/torture/rpc/echo.c
source4/torture/rpc/spoolss.c

index f7c65485f85b229debcd0274e9fa545f0bd63a3b..f68bcf38c3fb85b932fe7a677baeb0e803dee9a4 100644 (file)
@@ -25,27 +25,7 @@ interface rpcecho
                [out,ref,size_is(len)] uint8 *data
        );
 
-#define int uint32
-
-       typedef struct {
-               int *count;
-       } echo_Enum1;
-
-       typedef struct {
-               int *count;
-       } echo_Enum3;
-
-       typedef union {
-               [case(1)] echo_Enum1 enum1;
-               [case(3)] echo_Enum3 enum3;
-       } echo_EnumInfo;
-
-       typedef struct {
-               int level;
-               [switch_is(level)] echo_EnumInfo e;
-       } Struct1;
-       
        void TestCall (
-               [out]        Struct1 *s1
+               [in]  unistr *s
                );
 }
index 4800d8ff2a1b3131930a8181c257517ff2f355ad..f39c17c3958ca4c3e2836437998f63bcde5ccfce 100644 (file)
                uint32 transmission_retry_timeout;
        } spoolss_PrinterInfo5;
 
-       typedef struct {
-               uint32 foo;
-       } spoolss_PrinterInfo6;
-
        typedef struct {
                [relative] nstring guid; /* text form of printer guid */
                uint32 action;
                case(3) spoolss_PrinterInfo3 info3;
                case(4) spoolss_PrinterInfo4 info4;
                case(5) spoolss_PrinterInfo5 info5;
-               case(6) spoolss_PrinterInfo6 info6;
                case(7) spoolss_PrinterInfo7 info7;
        } spoolss_PrinterInfo;
 
        WERROR spoolss_GetPrinter(
                [in,ref]     policy_handle *handle,
                [in]         uint32 level,
-               [in,out]     DATA_BLOB *buffer,
+               [in]         DATA_BLOB *buffer,
+               [out,subcontext,switch_is(level)] spoolss_PrinterInfo *info,
                [in,out,ref] uint32 *buf_size
                );
 
index 5f941c703d429c345a4daf8cefd17e4e2bea0e72..6d2a6a99ddffa979fb0614a679fb7ef90501bf2d 100644 (file)
@@ -399,6 +399,9 @@ NTSTATUS ndr_pull_subcontext_flags_fn(struct ndr_pull *ndr,
        struct ndr_pull ndr2;
 
        NDR_CHECK(ndr_pull_uint32(ndr, &size));
+       if (size == 0) {
+               return NT_STATUS_OK;
+       }
        NDR_CHECK(ndr_pull_subcontext(ndr, &ndr2, size));
        NDR_CHECK(fn(&ndr2, NDR_SCALARS|NDR_BUFFERS, base));
        NDR_CHECK(ndr_pull_advance(ndr, size));
@@ -414,6 +417,9 @@ NTSTATUS ndr_pull_subcontext_union_fn(struct ndr_pull *ndr,
        struct ndr_pull ndr2;
 
        NDR_CHECK(ndr_pull_uint32(ndr, &size));
+       if (size == 0) {
+               return NT_STATUS_OK;
+       }
        NDR_CHECK(ndr_pull_subcontext(ndr, &ndr2, size));
        NDR_CHECK(fn(&ndr2, NDR_SCALARS|NDR_BUFFERS, level, base));
        NDR_CHECK(ndr_pull_advance(ndr, size));
index 0067518f89c8a85cd2f3e87495fc4bb3d5649869..62a2428792083d5b290090699c8d3ff24908a7dc 100644 (file)
@@ -40,6 +40,10 @@ NTSTATUS ndr_push_echo_SourceData(struct ndr_push *ndr, struct echo_SourceData *
 
 NTSTATUS ndr_push_TestCall(struct ndr_push *ndr, struct TestCall *r)
 {
+       NDR_CHECK(ndr_push_ptr(ndr, r->in.s));
+       if (r->in.s) {
+               NDR_CHECK(ndr_push_unistr(ndr, r->in.s));
+       }
 
        return NT_STATUS_OK;
 }
@@ -90,172 +94,9 @@ NTSTATUS ndr_pull_echo_SourceData(struct ndr_pull *ndr, struct echo_SourceData *
        return NT_STATUS_OK;
 }
 
-NTSTATUS ndr_pull_echo_Enum1(struct ndr_pull *ndr, int ndr_flags, struct echo_Enum1 *r)
-{
-       uint32 _ptr_count;
-       NDR_CHECK(ndr_pull_struct_start(ndr));
-       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
-       NDR_CHECK(ndr_pull_align(ndr, 4));
-       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_count));
-       if (_ptr_count) {
-               NDR_ALLOC(ndr, r->count);
-       } else {
-               r->count = NULL;
-       }
-       ndr_pull_struct_end(ndr);
-buffers:
-       if (!(ndr_flags & NDR_BUFFERS)) goto done;
-       if (r->count) {
-               NDR_CHECK(ndr_pull_uint32(ndr, r->count));
-       }
-done:
-       return NT_STATUS_OK;
-}
-
-NTSTATUS ndr_pull_echo_Enum3(struct ndr_pull *ndr, int ndr_flags, struct echo_Enum3 *r)
-{
-       uint32 _ptr_count;
-       NDR_CHECK(ndr_pull_struct_start(ndr));
-       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
-       NDR_CHECK(ndr_pull_align(ndr, 4));
-       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_count));
-       if (_ptr_count) {
-               NDR_ALLOC(ndr, r->count);
-       } else {
-               r->count = NULL;
-       }
-       ndr_pull_struct_end(ndr);
-buffers:
-       if (!(ndr_flags & NDR_BUFFERS)) goto done;
-       if (r->count) {
-               NDR_CHECK(ndr_pull_uint32(ndr, r->count));
-       }
-done:
-       return NT_STATUS_OK;
-}
-
-NTSTATUS ndr_pull_echo_EnumInfo(struct ndr_pull *ndr, int ndr_flags, uint16 *level, union echo_EnumInfo *r)
-{
-       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
-       NDR_CHECK(ndr_pull_struct_start(ndr));
-       NDR_CHECK(ndr_pull_uint16(ndr, level));
-       switch (*level) {
-       case 1: {
-       NDR_CHECK(ndr_pull_echo_Enum1(ndr, NDR_SCALARS, &r->enum1));
-       break; }
-
-       case 3: {
-       NDR_CHECK(ndr_pull_echo_Enum3(ndr, NDR_SCALARS, &r->enum3));
-       break; }
-
-       default:
-               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
-       }
-       ndr_pull_struct_end(ndr);
-buffers:
-       if (!(ndr_flags & NDR_BUFFERS)) goto done;
-       switch (*level) {
-       case 1:
-               NDR_CHECK(ndr_pull_echo_Enum1(ndr, NDR_BUFFERS, &r->enum1));
-       break;
-
-       case 3:
-               NDR_CHECK(ndr_pull_echo_Enum3(ndr, NDR_BUFFERS, &r->enum3));
-       break;
-
-       default:
-               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
-       }
-done:
-       return NT_STATUS_OK;
-}
-
-NTSTATUS ndr_pull_Struct1(struct ndr_pull *ndr, int ndr_flags, struct Struct1 *r)
-{
-       NDR_CHECK(ndr_pull_struct_start(ndr));
-       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
-       NDR_CHECK(ndr_pull_align(ndr, 4));
-       NDR_CHECK(ndr_pull_uint32(ndr, &r->level));
-       { uint16 _level = r->level;
-       NDR_CHECK(ndr_pull_echo_EnumInfo(ndr, NDR_SCALARS, &_level, &r->e));
-       if (((NDR_SCALARS) & NDR_SCALARS) && (_level != r->level)) return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u in e");
-       }
-       ndr_pull_struct_end(ndr);
-buffers:
-       if (!(ndr_flags & NDR_BUFFERS)) goto done;
-       { uint16 _level = r->level;
-       NDR_CHECK(ndr_pull_echo_EnumInfo(ndr, NDR_BUFFERS, &_level, &r->e));
-       if (((NDR_BUFFERS) & NDR_SCALARS) && (_level != r->level)) return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u in e");
-       }
-done:
-       return NT_STATUS_OK;
-}
-
 NTSTATUS ndr_pull_TestCall(struct ndr_pull *ndr, struct TestCall *r)
 {
-       uint32 _ptr_s1;
-       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_s1));
-       if (_ptr_s1) {
-               NDR_ALLOC(ndr, r->out.s1);
-       } else {
-               r->out.s1 = NULL;
-       }
-       if (r->out.s1) {
-               NDR_CHECK(ndr_pull_Struct1(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.s1));
-       }
 
        return NT_STATUS_OK;
 }
 
-void ndr_print_echo_Enum1(struct ndr_print *ndr, const char *name, struct echo_Enum1 *r)
-{
-       ndr_print_struct(ndr, name, "echo_Enum1");
-       ndr->depth++;
-       ndr_print_ptr(ndr, "count", r->count);
-       ndr->depth++;
-       if (r->count) {
-               ndr_print_uint32(ndr, "count", *r->count);
-       }
-       ndr->depth--;
-       ndr->depth--;
-}
-
-void ndr_print_echo_Enum3(struct ndr_print *ndr, const char *name, struct echo_Enum3 *r)
-{
-       ndr_print_struct(ndr, name, "echo_Enum3");
-       ndr->depth++;
-       ndr_print_ptr(ndr, "count", r->count);
-       ndr->depth++;
-       if (r->count) {
-               ndr_print_uint32(ndr, "count", *r->count);
-       }
-       ndr->depth--;
-       ndr->depth--;
-}
-
-void ndr_print_echo_EnumInfo(struct ndr_print *ndr, const char *name, uint16 level, union echo_EnumInfo *r)
-{
-       ndr_print_union(ndr, name, level, "echo_EnumInfo");
-       switch (level) {
-       case 1:
-       ndr_print_echo_Enum1(ndr, "enum1", &r->enum1);
-       break;
-
-       case 3:
-       ndr_print_echo_Enum3(ndr, "enum3", &r->enum3);
-       break;
-
-       default:
-               ndr_print_bad_level(ndr, name, level);
-       }
-}
-
-void ndr_print_Struct1(struct ndr_print *ndr, const char *name, struct Struct1 *r)
-{
-       ndr_print_struct(ndr, name, "Struct1");
-       ndr->depth++;
-       ndr_print_uint32(ndr, "level", r->level);
-       ndr_print_echo_EnumInfo(ndr, "e", r->level, &r->e);
-       ndr->depth--;
-}
-
index 5edc4241a6c48325d72aedcbd660e3bec331cda8..d6b6f0eb9617f9584da90cfd9862b3aec4561049 100644 (file)
@@ -45,30 +45,12 @@ struct echo_SourceData {
 
 };
 
-struct echo_Enum1 {
-       uint32 *count;
-};
-
-struct echo_Enum3 {
-       uint32 *count;
-};
-
-union echo_EnumInfo {
-/* [case(1)] */ struct echo_Enum1 enum1;
-/* [case(3)] */ struct echo_Enum3 enum3;
-};
-
-struct Struct1 {
-       uint32 level;
-       union echo_EnumInfo e;
-};
-
 struct TestCall {
        struct {
+               const char *s;
        } in;
 
        struct {
-               struct Struct1 *s1;
        } out;
 
 };
index 27227d1b902028976f8f50f445e7e2c0807b4bfc..4f31fa682b8861c5d2cc134ee3444e783fe57256 100644 (file)
@@ -172,19 +172,6 @@ done:
        return NT_STATUS_OK;
 }
 
-NTSTATUS ndr_push_spoolss_PrinterInfo6(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo6 *r)
-{
-       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
-       NDR_CHECK(ndr_push_struct_start(ndr));
-       NDR_CHECK(ndr_push_align(ndr, 4));
-       NDR_CHECK(ndr_push_uint32(ndr, r->foo));
-       ndr_push_struct_end(ndr);
-buffers:
-       if (!(ndr_flags & NDR_BUFFERS)) goto done;
-done:
-       return NT_STATUS_OK;
-}
-
 NTSTATUS ndr_push_spoolss_PrinterInfo7(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo7 *r)
 {
        if (!(ndr_flags & NDR_SCALARS)) goto buffers;
@@ -225,10 +212,6 @@ NTSTATUS ndr_push_spoolss_PrinterInfo(struct ndr_push *ndr, int ndr_flags, uint1
        NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
        break;
 
-       case 6:
-       NDR_CHECK(ndr_push_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
-       break;
-
        case 7:
        NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
        break;
@@ -260,10 +243,6 @@ buffers:
                NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, ndr_flags, &r->info5));
        break;
 
-       case 6:
-               NDR_CHECK(ndr_push_spoolss_PrinterInfo6(ndr, ndr_flags, &r->info6));
-       break;
-
        case 7:
                NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, ndr_flags, &r->info7));
        break;
@@ -1148,19 +1127,6 @@ done:
        return NT_STATUS_OK;
 }
 
-NTSTATUS ndr_pull_spoolss_PrinterInfo6(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo6 *r)
-{
-       NDR_CHECK(ndr_pull_struct_start(ndr));
-       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
-       NDR_CHECK(ndr_pull_align(ndr, 4));
-       NDR_CHECK(ndr_pull_uint32(ndr, &r->foo));
-       ndr_pull_struct_end(ndr);
-buffers:
-       if (!(ndr_flags & NDR_BUFFERS)) goto done;
-done:
-       return NT_STATUS_OK;
-}
-
 NTSTATUS ndr_pull_spoolss_PrinterInfo7(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo7 *r)
 {
        NDR_CHECK(ndr_pull_struct_start(ndr));
@@ -1200,10 +1166,6 @@ NTSTATUS ndr_pull_spoolss_PrinterInfo(struct ndr_pull *ndr, int ndr_flags, uint1
        NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
        break; }
 
-       case 6: {
-       NDR_CHECK(ndr_pull_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
-       break; }
-
        case 7: {
        NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
        break; }
@@ -1235,10 +1197,6 @@ buffers:
                NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_BUFFERS, &r->info5));
        break;
 
-       case 6:
-               NDR_CHECK(ndr_pull_spoolss_PrinterInfo6(ndr, NDR_BUFFERS, &r->info6));
-       break;
-
        case 7:
                NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_BUFFERS, &r->info7));
        break;
@@ -1333,15 +1291,18 @@ NTSTATUS ndr_pull_spoolss_07(struct ndr_pull *ndr, struct spoolss_07 *r)
 
 NTSTATUS ndr_pull_spoolss_GetPrinter(struct ndr_pull *ndr, struct spoolss_GetPrinter *r)
 {
-       uint32 _ptr_buffer;
-       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_buffer));
-       if (_ptr_buffer) {
-               NDR_ALLOC(ndr, r->out.buffer);
+       uint32 _ptr_info;
+       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info));
+       if (_ptr_info) {
+               NDR_ALLOC(ndr, r->out.info);
        } else {
-               r->out.buffer = NULL;
+               r->out.info = NULL;
+       }
+       if (r->out.info) {
+       { uint16 _level = r->in.level;
+       NDR_CHECK(ndr_pull_subcontext_union_fn(ndr, &_level, r->out.info, (ndr_pull_union_fn_t) ndr_pull_spoolss_PrinterInfo));
+       if (((NDR_SCALARS|NDR_BUFFERS) & NDR_SCALARS) && (_level != r->in.level)) return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u in info");
        }
-       if (r->out.buffer) {
-               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, r->out.buffer));
        }
        NDR_CHECK(ndr_pull_uint32(ndr, r->out.buf_size));
        NDR_CHECK(ndr_pull_WERROR(ndr, &r->out.result));
@@ -2109,14 +2070,6 @@ void ndr_print_spoolss_PrinterInfo5(struct ndr_print *ndr, const char *name, str
        ndr->depth--;
 }
 
-void ndr_print_spoolss_PrinterInfo6(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo6 *r)
-{
-       ndr_print_struct(ndr, name, "spoolss_PrinterInfo6");
-       ndr->depth++;
-       ndr_print_uint32(ndr, "foo", r->foo);
-       ndr->depth--;
-}
-
 void ndr_print_spoolss_PrinterInfo7(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo7 *r)
 {
        ndr_print_struct(ndr, name, "spoolss_PrinterInfo7");
@@ -2150,10 +2103,6 @@ void ndr_print_spoolss_PrinterInfo(struct ndr_print *ndr, const char *name, uint
        ndr_print_spoolss_PrinterInfo5(ndr, "info5", &r->info5);
        break;
 
-       case 6:
-       ndr_print_spoolss_PrinterInfo6(ndr, "info6", &r->info6);
-       break;
-
        case 7:
        ndr_print_spoolss_PrinterInfo7(ndr, "info7", &r->info7);
        break;
index 3f156b732d3d5e105bc65d41a7c3980be8a4e8ba..33881ab41bb059e1bf1fd1a5b17e8b52740e8fcf 100644 (file)
@@ -88,10 +88,6 @@ struct spoolss_PrinterInfo5 {
        uint32 transmission_retry_timeout;
 };
 
-struct spoolss_PrinterInfo6 {
-       uint32 foo;
-};
-
 struct spoolss_PrinterInfo7 {
        const char * guid;
        uint32 action;
@@ -103,7 +99,6 @@ union spoolss_PrinterInfo {
 /* [case(3)] */ struct spoolss_PrinterInfo3 info3;
 /* [case(4)] */ struct spoolss_PrinterInfo4 info4;
 /* [case(5)] */ struct spoolss_PrinterInfo5 info5;
-/* [case(6)] */ struct spoolss_PrinterInfo6 info6;
 /* [case(7)] */ struct spoolss_PrinterInfo7 info7;
 };
 
@@ -218,7 +213,7 @@ struct spoolss_GetPrinter {
        } in;
 
        struct {
-               DATA_BLOB *buffer;
+               union spoolss_PrinterInfo *info;
                uint32 *buf_size;
                WERROR result;
        } out;
index 1e6328f3b4995e08b4bf667be314ab25cbe3bd75..3ae0c76a74ecd3994ef0024270fd36e7546d3fb9 100644 (file)
@@ -170,6 +170,9 @@ static BOOL test_testcall(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
 {
        NTSTATUS status;
        struct TestCall r;
+       char *s = "foo!";
+
+       r.in.s = s;
 
        printf("\nTesting TestCall\n");
        status = dcerpc_TestCall(p, mem_ctx, &r);
@@ -178,8 +181,6 @@ static BOOL test_testcall(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
                return False;
        }
 
-       NDR_PRINT_DEBUG(Struct1, r.out.s1);     
-
        return True;
 }
 
index c44c2a1db87f6cae4adee937579635f461fcb9d5..895677eba3c19f1f3d2622d3d085e69304c7bca5 100644 (file)
@@ -26,14 +26,12 @@ BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 {
        NTSTATUS status;
        struct spoolss_GetPrinter r;
-       uint32 buf_size = 0;
-       DATA_BLOB blob;
-       union spoolss_PrinterInfo info;
        uint16 levels[] = {1, 2, 3, 4, 5, 6, 7};
        int i;
        BOOL ret = True;
        
        for (i=0;i<ARRAY_SIZE(levels);i++) {
+               uint32 buf_size = 0;
                r.in.handle = handle;
                r.in.level = levels[i];
                r.in.buffer = NULL;
@@ -50,7 +48,7 @@ BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                }
                
                if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-                       blob = data_blob_talloc(mem_ctx, NULL, buf_size);
+                       DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size);
                        data_blob_clear(&blob);
                        r.in.buffer = &blob;
                        status = dcerpc_spoolss_GetPrinter(p, mem_ctx, &r);
@@ -63,16 +61,8 @@ BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                        ret = False;
                        continue;
                }
-               
-               status = ndr_pull_union_blob(r.out.buffer, mem_ctx, r.in.level, &info,
-                                            (ndr_pull_union_fn_t)ndr_pull_spoolss_PrinterInfo);
-               if (!NT_STATUS_IS_OK(status)) {
-                       printf("PrinterInfo parse failed - %s\n", nt_errstr(status));
-                       ret = False;
-                       continue;
-               }
-               
-               NDR_PRINT_UNION_DEBUG(spoolss_PrinterInfo, r.in.level, &info);
+
+               NDR_PRINT_UNION_DEBUG(spoolss_PrinterInfo, r.in.level, r.out.info);
        }
 
        return ret;
@@ -194,7 +184,7 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
 {
        struct spoolss_EnumPrinters r;
        NTSTATUS status;
-       uint16 levels[] = {1, 2, 3, 4, 5, 6, 7};
+       uint16 levels[] = {1, 2, 4, 5};
        int i;
        BOOL ret = True;