diff options
author | Andrew Tridgell <tridge@samba.org> | 2003-11-17 09:34:19 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2003-11-17 09:34:19 +0000 |
commit | e62c5c9a8dd1258b776d40918026a1be4b71fb72 (patch) | |
tree | 877a0934d7082d96093d420627e3d3797b67483e /source4 | |
parent | c562794e7477e56251baea4f954794ec189f2847 (diff) | |
download | samba-e62c5c9a8dd1258b776d40918026a1be4b71fb72.tar.gz samba-e62c5c9a8dd1258b776d40918026a1be4b71fb72.tar.bz2 samba-e62c5c9a8dd1258b776d40918026a1be4b71fb72.zip |
use [subcontext] to make GetPrinter a bit easier in smbtorture
(This used to be commit a5140985d8f57695b4165c72af217092da6fae5f)
Diffstat (limited to 'source4')
-rw-r--r-- | source4/librpc/idl/echo.idl | 22 | ||||
-rw-r--r-- | source4/librpc/idl/spoolss.idl | 8 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr.c | 6 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_echo.c | 167 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_echo.h | 20 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_spoolss.c | 71 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_spoolss.h | 7 | ||||
-rw-r--r-- | source4/torture/rpc/echo.c | 5 | ||||
-rw-r--r-- | source4/torture/rpc/spoolss.c | 20 |
9 files changed, 33 insertions, 293 deletions
diff --git a/source4/librpc/idl/echo.idl b/source4/librpc/idl/echo.idl index f7c65485f8..f68bcf38c3 100644 --- a/source4/librpc/idl/echo.idl +++ b/source4/librpc/idl/echo.idl @@ -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 ); } diff --git a/source4/librpc/idl/spoolss.idl b/source4/librpc/idl/spoolss.idl index 4800d8ff2a..f39c17c395 100644 --- a/source4/librpc/idl/spoolss.idl +++ b/source4/librpc/idl/spoolss.idl @@ -99,10 +99,6 @@ } spoolss_PrinterInfo5; typedef struct { - uint32 foo; - } spoolss_PrinterInfo6; - - typedef struct { [relative] nstring guid; /* text form of printer guid */ uint32 action; } spoolss_PrinterInfo7; @@ -113,7 +109,6 @@ 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; @@ -178,7 +173,8 @@ 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 ); diff --git a/source4/librpc/ndr/ndr.c b/source4/librpc/ndr/ndr.c index 5f941c703d..6d2a6a99dd 100644 --- a/source4/librpc/ndr/ndr.c +++ b/source4/librpc/ndr/ndr.c @@ -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)); diff --git a/source4/librpc/ndr/ndr_echo.c b/source4/librpc/ndr/ndr_echo.c index 0067518f89..62a2428792 100644 --- a/source4/librpc/ndr/ndr_echo.c +++ b/source4/librpc/ndr/ndr_echo.c @@ -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--; -} - diff --git a/source4/librpc/ndr/ndr_echo.h b/source4/librpc/ndr/ndr_echo.h index 5edc4241a6..d6b6f0eb96 100644 --- a/source4/librpc/ndr/ndr_echo.h +++ b/source4/librpc/ndr/ndr_echo.h @@ -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; }; diff --git a/source4/librpc/ndr/ndr_spoolss.c b/source4/librpc/ndr/ndr_spoolss.c index 27227d1b90..4f31fa682b 100644 --- a/source4/librpc/ndr/ndr_spoolss.c +++ b/source4/librpc/ndr/ndr_spoolss.c @@ -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; diff --git a/source4/librpc/ndr/ndr_spoolss.h b/source4/librpc/ndr/ndr_spoolss.h index 3f156b732d..33881ab41b 100644 --- a/source4/librpc/ndr/ndr_spoolss.h +++ b/source4/librpc/ndr/ndr_spoolss.h @@ -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; diff --git a/source4/torture/rpc/echo.c b/source4/torture/rpc/echo.c index 1e6328f3b4..3ae0c76a74 100644 --- a/source4/torture/rpc/echo.c +++ b/source4/torture/rpc/echo.c @@ -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; } diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c44c2a1db8..895677eba3 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -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; |