From 78b7118d1aeccc9da490af614d4646a328ac2c46 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 15 Nov 2003 05:42:49 +0000 Subject: Skeleton IDL for SPOOLSS pipe. For this inital version, only OpenPrinterEx works but without a devicemode. (This used to be commit 35e889cf339f4ed62d4953b4cb5da2f21cf249a2) --- source4/torture/rpc/spoolss.c | 76 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 source4/torture/rpc/spoolss.c (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c new file mode 100644 index 0000000000..83a7778a59 --- /dev/null +++ b/source4/torture/rpc/spoolss.c @@ -0,0 +1,76 @@ +/* + Unix SMB/CIFS implementation. + test suite for spoolss rpc operations + + Copyright (C) Tim Potter 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +{ + struct spoolss_OpenPrinterEx r; + struct spoolss_UserLevel1 userlevel1; + NTSTATUS status; + + r.in.printername = "p"; + r.in.datatype = NULL; + r.in.devmode_ctr.size = 0; + r.in.devmode_ctr.devmode = NULL; + r.in.access_required = 0x12345678; + r.in.level = 1; + userlevel1.size = 1234; + userlevel1.client = "hello"; + userlevel1.user = "spottyfoot!"; + userlevel1.build = 1; + userlevel1.major = 2; + userlevel1.minor = 3; + userlevel1.processor = 4; + r.in.userlevel.level1 = &userlevel1; + + status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("OpenPrinter failed - %s\n", nt_errstr(status)); + return False; + } + + return True; +} + +BOOL torture_rpc_spoolss(int dummy) +{ + NTSTATUS status; + struct dcerpc_pipe *p; + TALLOC_CTX *mem_ctx; + BOOL ret = True; + + mem_ctx = talloc_init("torture_rpc_spoolss"); + + status = torture_rpc_connection(&p, "spoolss"); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + if (!test_OpenPrinterEx(p, mem_ctx)) { + ret = False; + } + + torture_rpc_close(p); + + return ret; +} -- cgit From 5bd51a1d5d88459eca341d252f156fcf32bdc222 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 15 Nov 2003 20:56:18 +0000 Subject: the returned policy handle in spoolss_OpenPrinterEx() is pass by reference (tim, my apoligies if this conflicts with an uncomitted fix from you) (This used to be commit fa0872e66359603a52813af13b45fdaeca98f5d0) --- source4/torture/rpc/spoolss.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 83a7778a59..7f4809109a 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -25,6 +25,7 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_OpenPrinterEx r; struct spoolss_UserLevel1 userlevel1; + struct policy_handle handle; NTSTATUS status; r.in.printername = "p"; @@ -33,6 +34,8 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) r.in.devmode_ctr.devmode = NULL; r.in.access_required = 0x12345678; r.in.level = 1; + r.out.handle = &handle; + userlevel1.size = 1234; userlevel1.client = "hello"; userlevel1.user = "spottyfoot!"; -- cgit From 274667be32531da20f76b7ffc039c45f86e59282 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sun, 16 Nov 2003 04:20:29 +0000 Subject: Added tests for EnumPrinters and ClosePrinter. (This used to be commit 9f3b84c7d7a7e6316b2cc051b01efcfb679534ad) --- source4/torture/rpc/spoolss.c | 78 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 6 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 7f4809109a..e83e63eea4 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -21,20 +21,57 @@ #include "includes.h" -static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +{ + struct spoolss_EnumPrinters r; + NTSTATUS status; + + r.in.flags = 0x02; + r.in.server = "\\\\movingforward"; + r.in.level = 1; + r.in.buffer = NULL; + r.in.offered = 0; + + status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r); + + if (NT_STATUS_IS_ERR(status)) { + printf("OpenPrinter failed - %s\n", nt_errstr(status)); + return False; + } + + if (NT_STATUS_V(status) == 0x0000007a) { + struct uint8_buf buffer; + + r.in.offered = r.out.needed; + buffer.size = r.out.needed; + buffer.data = talloc(mem_ctx, buffer.size); + memset(buffer.data, 0xfe, buffer.size); + r.in.buffer = &buffer; + status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r); + } + + if (!NT_STATUS_IS_OK(status)) { + printf("OpenPrinter failed - %s\n", nt_errstr(status)); + return False; + } + + return True; +} + +static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) { struct spoolss_OpenPrinterEx r; struct spoolss_UserLevel1 userlevel1; - struct policy_handle handle; NTSTATUS status; - r.in.printername = "p"; + r.in.printername = "\\\\movingforward\\p"; r.in.datatype = NULL; r.in.devmode_ctr.size = 0; r.in.devmode_ctr.devmode = NULL; - r.in.access_required = 0x12345678; + r.in.access_required = 0x02000000; r.in.level = 1; - r.out.handle = &handle; + r.out.handle = handle; userlevel1.size = 1234; userlevel1.client = "hello"; @@ -55,12 +92,33 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) return True; } +static BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + struct spoolss_ClosePrinter r; + struct policy_handle handle2; + NTSTATUS status; + + r.in.handle = handle; + r.out.handle = &handle2; + + status = dcerpc_spoolss_ClosePrinter(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("ClosePrinter failed - %s\n", nt_errstr(status)); + return False; + } + + return True; +} + BOOL torture_rpc_spoolss(int dummy) { NTSTATUS status; struct dcerpc_pipe *p; TALLOC_CTX *mem_ctx; BOOL ret = True; + struct policy_handle handle; mem_ctx = talloc_init("torture_rpc_spoolss"); @@ -69,7 +127,15 @@ BOOL torture_rpc_spoolss(int dummy) return False; } - if (!test_OpenPrinterEx(p, mem_ctx)) { + if (!test_EnumPrinters(p, mem_ctx)) { + ret = False; + } + + if (!test_OpenPrinterEx(p, mem_ctx, &handle)) { + ret = False; + } + + if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } -- cgit From ea266c0625e04a2dc10d25c2fee7b685965fcd3e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 16 Nov 2003 11:36:59 +0000 Subject: added support for level1 of EnumPrinters in spoolss. This uses a number of "magic" add-ons to IDL to make it less painful, hopefully this will make IDL generation useful for horrible systems like spoolss (This used to be commit e18dba7d5a957ef82e8f91733a0bf95d579dcd7a) --- source4/torture/rpc/spoolss.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e83e63eea4..e0aa429ae7 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -25,34 +25,37 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; NTSTATUS status; + uint32 needed = 0; r.in.flags = 0x02; - r.in.server = "\\\\movingforward"; + r.in.server = ""; r.in.level = 1; - r.in.buffer = NULL; - r.in.offered = 0; + r.in.buf = NULL; + r.in.offered = needed; + r.out.needed = &needed; status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r); - if (NT_STATUS_IS_ERR(status)) { - printf("OpenPrinter failed - %s\n", nt_errstr(status)); + printf("EnumPrinters failed - %s\n", nt_errstr(status)); return False; } if (NT_STATUS_V(status) == 0x0000007a) { - struct uint8_buf buffer; - - r.in.offered = r.out.needed; - buffer.size = r.out.needed; - buffer.data = talloc(mem_ctx, buffer.size); - memset(buffer.data, 0xfe, buffer.size); - r.in.buffer = &buffer; + r.in.buf = talloc(mem_ctx, needed); + if (!r.in.buf) { + return False; + } + memset(r.in.buf, 0xfe, needed); + r.in.offered = needed; status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r); } if (!NT_STATUS_IS_OK(status)) { - printf("OpenPrinter failed - %s\n", nt_errstr(status)); - return False; + printf("EnumPrinters failed - %s\n", nt_errstr(status)); + } + + if (r.out.info) { + NDR_PRINT_UNION_DEBUG(spoolss_PrinterEnum, r.in.level, r.out.info); } return True; -- cgit From ae4cb40100a5c04a4604acfde989ce96ef1801bd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 16 Nov 2003 13:49:14 +0000 Subject: use nstring and [relative] to support levels 1 and 2 of EnumPrinters fully (This used to be commit 69c6017c945bdd7d1945f22fcad49112ba6a2d2d) --- source4/torture/rpc/spoolss.c | 64 +++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 27 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e0aa429ae7..e7e35659d7 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -25,40 +25,50 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; NTSTATUS status; - uint32 needed = 0; + uint16 levels[] = {1, 2}; + int i; + BOOL ret = True; - r.in.flags = 0x02; - r.in.server = ""; - r.in.level = 1; - r.in.buf = NULL; - r.in.offered = needed; - r.out.needed = &needed; + for (i=0;i Date: Mon, 17 Nov 2003 02:18:11 +0000 Subject: nicer method of handling spoolss EnumPrinters this also handles the return of several printers (an array of relative subcontexts) (This used to be commit 060421c7dc9aa611fe4160843a4f76498ab16bf4) --- source4/torture/rpc/spoolss.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e7e35659d7..d203be2d47 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -30,14 +30,16 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) BOOL ret = True; for (i=0;i Date: Mon, 17 Nov 2003 02:58:10 +0000 Subject: * more info levels for EnumPrinter * use WERROR return type in spoolss EnumPrinter (This used to be commit 8301a6b6ad45f76a42d0fcab6347c187eee615a9) --- source4/torture/rpc/spoolss.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index d203be2d47..13e2b2642f 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -25,7 +25,7 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; NTSTATUS status; - uint16 levels[] = {1, 2}; + uint16 levels[] = {1, 2, 3, 4, 5, 6, 7}; int i; BOOL ret = True; @@ -50,20 +50,24 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) continue; } - if (NT_STATUS_V(status) == ERRinsufficientbuffer) { + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size); data_blob_clear(&blob); r.in.buffer = &blob; status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r); } - if (!NT_STATUS_IS_OK(status)) { - printf("EnumPrinters failed - %s\n", nt_errstr(status)); + if (!NT_STATUS_IS_OK(status) || + !W_ERROR_IS_OK(r.out.result)) { + printf("EnumPrinters failed - %s/%s\n", + nt_errstr(status), win_errstr(r.out.result)); + continue; } status = pull_spoolss_PrinterEnumArray(r.out.buffer, mem_ctx, r.in.level, r.out.count, &info); if (!NT_STATUS_IS_OK(status)) { printf("EnumPrintersArray parse failed - %s\n", nt_errstr(status)); + continue; } for (j=0;j Date: Mon, 17 Nov 2003 03:38:13 +0000 Subject: added OpenPrinter and a test function. Note that the Samba3 structure for OpenPrinter was wrong. (This used to be commit 186ddbbf8774d0960852ea9186c8e4e6f7be7a0f) --- source4/torture/rpc/spoolss.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 13e2b2642f..0f104491b6 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -21,6 +21,35 @@ #include "includes.h" +static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct spoolss_PrinterInfo1 *info1) +{ + NTSTATUS status; + struct spoolss_OpenPrinter r; + struct policy_handle handle; + DATA_BLOB blob; + + blob = data_blob(NULL, 0); + + r.in.server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); + r.in.printer = info1->name; + r.in.buffer = &blob; + r.in.access_mask = SEC_RIGHT_MAXIMUM_ALLOWED; + r.out.handle = &handle; + + printf("Testing OpenPrinter(\\\\%s\\%s)\n", r.in.server, r.in.printer); + + status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { + printf("OpenPrinter failed - %s/%s\n", + nt_errstr(status), win_errstr(r.out.result)); + return False; + } + + + return True; +} + static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; @@ -74,6 +103,13 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) printf("Printer %d\n", j); NDR_PRINT_UNION_DEBUG(spoolss_PrinterEnum, r.in.level, &info[j]); } + + for (j=0;j Date: Mon, 17 Nov 2003 04:56:59 +0000 Subject: call OpenPrinterEx on each printer on the server, and then call GetPrinter with all info levels on each printer (This used to be commit 136b3cfc0460315e924c3d9c8328c1850fc21fba) --- source4/torture/rpc/spoolss.c | 236 ++++++++++++++++++++++++++++-------------- 1 file changed, 161 insertions(+), 75 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 0f104491b6..c44c2a1db8 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -21,23 +21,102 @@ #include "includes.h" +BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + 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;iname; + r.in.printer = name; r.in.buffer = &blob; - r.in.access_mask = SEC_RIGHT_MAXIMUM_ALLOWED; + r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; r.out.handle = &handle; - printf("Testing OpenPrinter(\\\\%s\\%s)\n", r.in.server, r.in.printer); + printf("\nTesting OpenPrinter(\\\\%s\\%s)\n", r.in.server, r.in.printer); status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { @@ -46,10 +125,71 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } + + if (!test_GetPrinter(p, mem_ctx, &handle)) { + ret = False; + } + + if (!test_ClosePrinter(p, mem_ctx, &handle)) { + ret = False; + } - return True; + return ret; +} + +static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + const char *name) +{ + struct policy_handle handle; + struct spoolss_OpenPrinterEx r; + struct spoolss_UserLevel1 userlevel1; + NTSTATUS status; + BOOL ret = True; + + r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", + dcerpc_server_name(p), name); + r.in.datatype = NULL; + r.in.devmode_ctr.size = 0; + r.in.devmode_ctr.devmode = NULL; + r.in.access_required = 0x02000000; + r.in.level = 1; + r.out.handle = &handle; + + userlevel1.size = 1234; + userlevel1.client = "hello"; + userlevel1.user = "spottyfoot!"; + userlevel1.build = 1; + userlevel1.major = 2; + userlevel1.minor = 3; + userlevel1.processor = 4; + r.in.userlevel.level1 = &userlevel1; + + printf("Testing OpenPrinterEx(%s)\n", r.in.printername); + + status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("OpenPrinterEx failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("OpenPrinterEx failed - %s\n", win_errstr(r.out.result)); + return False; + } + + if (!test_GetPrinter(p, mem_ctx, &handle)) { + ret = False; + } + + if (!test_ClosePrinter(p, mem_ctx, &handle)) { + ret = False; + } + + return ret; } + static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; @@ -60,7 +200,7 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) for (i=0;i Date: Mon, 17 Nov 2003 09:34:19 +0000 Subject: use [subcontext] to make GetPrinter a bit easier in smbtorture (This used to be commit a5140985d8f57695b4165c72af217092da6fae5f) --- source4/torture/rpc/spoolss.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') 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 Date: Mon, 17 Nov 2003 11:55:56 +0000 Subject: * add another WERR err code * use the top-level function argument printing to show more detail in RPC-* tests (This used to be commit 33bb8785625b1845750f28f2d810e7096afe9f8e) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 895677eba3..df001e7721 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -62,7 +62,7 @@ BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, continue; } - NDR_PRINT_UNION_DEBUG(spoolss_PrinterInfo, r.in.level, r.out.info); + NDR_PRINT_FUNCTION_DEBUG(spoolss_GetPrinter, NDR_BOTH, &r); } return ret; -- cgit From 2c0a7165efb1ce52be27bd13496e99c5e5c70e48 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 18 Nov 2003 01:18:24 +0000 Subject: * use the new auto-generated debug code method. * add a couple more info levels to wkssvc (This used to be commit c69161bdb13745f271b0cfa9a9af349f7a95edc6) --- source4/torture/rpc/spoolss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index df001e7721..feaeae7b79 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -61,8 +61,6 @@ BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; continue; } - - NDR_PRINT_FUNCTION_DEBUG(spoolss_GetPrinter, NDR_BOTH, &r); } return ret; @@ -267,6 +265,8 @@ BOOL torture_rpc_spoolss(int dummy) if (!NT_STATUS_IS_OK(status)) { return False; } + + p->flags |= DCERPC_DEBUG_PRINT_BOTH; if (!test_EnumPrinters(p, mem_ctx)) { ret = False; -- cgit From 9b7b5e5c516155d9606cc92bd22a958a8435ef48 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 18 Nov 2003 05:01:10 +0000 Subject: use the auto-generated UUID, version and name rather than listing them in the dcerpc core code (This used to be commit 16ffeb7c80bfe7f1bfbfce8c98066e9ddbca7686) --- source4/torture/rpc/spoolss.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index feaeae7b79..53e25a3e14 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -261,7 +261,10 @@ BOOL torture_rpc_spoolss(int dummy) mem_ctx = talloc_init("torture_rpc_spoolss"); - status = torture_rpc_connection(&p, "spoolss"); + status = torture_rpc_connection(&p, + DCERPC_SPOOLSS_NAME, + DCERPC_SPOOLSS_UUID, + DCERPC_SPOOLSS_VERSION); if (!NT_STATUS_IS_OK(status)) { return False; } -- cgit From 30daed2f7cc4baa69a31f139aaa5b5b260febc15 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 18 Nov 2003 05:54:14 +0000 Subject: Working on EnumPrinterData. There appears to be an alignment problem after reading a non-empty DATA_BLOB in the reply. (This used to be commit 3165bf532f6b5a074f20f38a9af56325eedbb1c2) --- source4/torture/rpc/spoolss.c | 45 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 53e25a3e14..9009c8e99a 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -87,6 +87,47 @@ BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct spoolss_EnumPrinterData r; + + r.in.handle = handle; + r.in.enum_index = 0; + + do { + uint32 data_size; + + r.in.value_offered = 0; + data_size = 0; + r.in.data_size = &data_size; + r.out.data_size = &data_size; + + printf("Testing EnumPrinterData\n"); + + status = dcerpc_spoolss_EnumPrinterData(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPrinterData failed - %s\n", nt_errstr(status)); + return False; + } + + r.in.value_offered = r.out.value_needed; + + status = dcerpc_spoolss_EnumPrinterData(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPrinterData failed - %s\n", nt_errstr(status)); + return False; + } + + r.in.enum_index++; + } while (1); + + return True; +} + static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *name) { @@ -170,6 +211,10 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_EnumPrinterData(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } -- cgit From 8f38cc8df83716b815cb75d6c3b502c13bd0ce8a Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 18 Nov 2003 09:19:34 +0000 Subject: cope with no printers returned from EnumPrinters (This used to be commit 8c49669dbec96df365d1866df24a17c1ff2c6cd0) --- source4/torture/rpc/spoolss.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 9009c8e99a..65bc6d519d 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -266,6 +266,11 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) continue; } + if (!r.out.buffer) { + printf("No printers returned"); + continue; + } + status = pull_spoolss_PrinterInfoArray(r.out.buffer, mem_ctx, r.in.level, r.out.count, &info); if (!NT_STATUS_IS_OK(status)) { printf("EnumPrintersArray parse failed - %s\n", nt_errstr(status)); -- cgit From f01e89e9e0800df912b5ee87bcacb664daa0895e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 20 Nov 2003 01:28:33 +0000 Subject: EnumPrinterData in spoolss now works (This used to be commit af07ca7fbcb4118f2415218d0c48798119b7c6b2) --- source4/torture/rpc/spoolss.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 65bc6d519d..6b208329e3 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -123,7 +123,7 @@ BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } r.in.enum_index++; - } while (1); + } while (!W_ERROR_IS_OK(r.out.result)); return True; } @@ -140,7 +140,7 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, blob = data_blob(NULL, 0); r.in.server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.printer = name; + r.in.printer = NULL; r.in.buffer = &blob; r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; r.out.handle = &handle; @@ -151,7 +151,8 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { printf("OpenPrinter failed - %s/%s\n", nt_errstr(status), win_errstr(r.out.result)); - return False; + /* don't consider failing this an error until we understand it */ + return True; } @@ -163,7 +164,7 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } - return ret; + return False; } static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, @@ -291,7 +292,6 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) if (!test_OpenPrinter(p, mem_ctx, name)) { ret = False; } - if (!test_OpenPrinterEx(p, mem_ctx, name)) { ret = False; } -- cgit From 86a604429ee13aa8c3f930ea74b1fada278ced45 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 22 Nov 2003 08:11:32 +0000 Subject: a fairly major upgrade to the dcerpc system * added a NDR validator. The way it works is that when the DCERPC_DEBUG_VALIDATE_* flags are set the dcerpc system will perform NDR buffer validation. On sending a request the packet is first marshalled, then unmarahslled, then marshalled again, and it is confirmed that the two marshalling results are idential. This ensures that our pull and push routines are absolutely in sync, so that we can be very confident that if a routine works in the client then the corresponding routine must work on the server side. A similar validation is performed on all replies. * a result of this change is that pidl is fussier about the [ref] tag. You can only use it on pointers (which is the only place it makes sense) * fixed a basic alignment bug in the push side of the NDR code * added server side pull/push support. Our dcerpc system is now fully ready to be used on the server side. * fixed the relative offset pointer list. It must be traversed in reverse order on push * added automatic value setting for the size parameter in outgoing SdBuf structures. * expanded the ndr debugging code to always give a message on any failure * fixed the subcontext push code * fixed some memory leaks in smbtorture RPC tests (This used to be commit 8ecf720206a2eef3f8ea7cbdb1f460664a5dba9a) --- source4/torture/rpc/spoolss.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 6b208329e3..6c85a78d20 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -325,6 +325,8 @@ BOOL torture_rpc_spoolss(int dummy) ret = False; } + talloc_destroy(mem_ctx); + torture_rpc_close(p); return ret; -- cgit From 677fb26deba2e8b8965c41d7b7455063db031a2c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 22 Nov 2003 10:37:00 +0000 Subject: * fixed handling of relative subcontext unions * fixed GetPrinter in spoolss after OpenPrinter (This used to be commit 4aea2d79dd6b14e0fdfafd2236849ece01839ce0) --- source4/torture/rpc/spoolss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 6c85a78d20..813bcdd6aa 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -139,13 +139,13 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, blob = data_blob(NULL, 0); - r.in.server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); + r.in.server = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name); r.in.printer = NULL; r.in.buffer = &blob; r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; r.out.handle = &handle; - printf("\nTesting OpenPrinter(\\\\%s\\%s)\n", r.in.server, r.in.printer); + printf("\nTesting OpenPrinter(\\\\%s)\n", r.in.server); status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { -- cgit From be77d9c60d17e0ef2ed0b51ea0814c42a41a40a3 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 22 Nov 2003 11:49:22 +0000 Subject: * fixed null terminated string handling * fixed nested relative offsets in push functions the spoolss torture test now passes! (This used to be commit 60ced76160e4f4e2b511ebbeec31130c8ebcdd22) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 813bcdd6aa..166be85d57 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -164,7 +164,7 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } - return False; + return ret; } static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, -- cgit From ee67d68f1c6d71d4d3fbe86899d5ea9f271cfbc8 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Wed, 26 Nov 2003 06:26:18 +0000 Subject: Implemented EnumForms and GetForm. (This used to be commit 822750592cffb175aa7afb268bc7cb47bbab47e4) --- source4/torture/rpc/spoolss.c | 106 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 166be85d57..6913290d1a 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -87,6 +87,108 @@ BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, char *formname) +{ + NTSTATUS status; + struct spoolss_GetForm r; + uint32 buf_size; + + r.in.handle = handle; + r.in.formname = formname; + r.in.level = 1; + r.in.buffer = NULL; + buf_size = 0; + r.in.buf_size = r.out.buf_size = &buf_size; + + printf("Testing GetForm\n"); + + status = dcerpc_spoolss_GetForm(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("GetForm failed - %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size); + + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_GetForm(p, mem_ctx, &r); + + if (!r.out.info) { + printf("No form info returned"); + return False; + } + } + + return True; +} + +BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct spoolss_EnumForms r; + uint32 buf_size; + + r.in.handle = handle; + r.in.level = 1; + r.in.buffer = NULL; + buf_size = 0; + r.in.buf_size = &buf_size; + r.out.buf_size = &buf_size; + + printf("Testing EnumForms\n"); + + status = dcerpc_spoolss_EnumForms(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumForms failed - %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size); + union spoolss_FormInfo *info; + int j; + + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_EnumForms(p, mem_ctx, &r); + + if (!r.out.buffer) { + printf("No forms returned"); + return False; + } + + status = pull_spoolss_FormInfoArray(r.out.buffer, mem_ctx, r.in.level, r.out.count, &info); + if (!NT_STATUS_IS_OK(status)) { + printf("EnumFormsArray parse failed - %s\n", nt_errstr(status)); + return False; + } + + for (j=0;j Date: Thu, 27 Nov 2003 06:15:06 +0000 Subject: Implemented AddForm RPC. The mystery of the useless_ptr has been solved. It was a pointer in a union member. RPC-SPOOLSS tests a bit messy and could do with a cleanup. (This used to be commit cf8cd4485261e861b16b98fb918758ff11282f1d) --- source4/torture/rpc/spoolss.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 6913290d1a..268288880c 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -122,6 +122,26 @@ BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("No form info returned"); return False; } + + { + struct spoolss_AddForm af; + struct spoolss_AddFormInfo1 form; + + af.in.handle = handle; + af.in.level = 1; + form.flags = 2; + form.name = "testform3"; + form.width = r.out.info->info1.width; + form.length = r.out.info->info1.length; + form.left = r.out.info->info1.left; + form.top = r.out.info->info1.top; + form.right = r.out.info->info1.right; + form.bottom = r.out.info->info1.bottom; + af.in.info.info1 = &form; + + status = dcerpc_spoolss_AddForm( + p, mem_ctx, &af); + } } return True; -- cgit From 6aee8274ef8623ef6a374feae248c0e5e9a10a49 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Thu, 27 Nov 2003 09:50:25 +0000 Subject: Add DeleteForm, start cleaning up tests. (This used to be commit 10b31623fd421d341787d0769839ea5dca5ae7c0) --- source4/torture/rpc/spoolss.c | 84 ++++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 20 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 268288880c..468484e471 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -122,26 +122,6 @@ BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("No form info returned"); return False; } - - { - struct spoolss_AddForm af; - struct spoolss_AddFormInfo1 form; - - af.in.handle = handle; - af.in.level = 1; - form.flags = 2; - form.name = "testform3"; - form.width = r.out.info->info1.width; - form.length = r.out.info->info1.length; - form.left = r.out.info->info1.left; - form.top = r.out.info->info1.top; - form.right = r.out.info->info1.right; - form.bottom = r.out.info->info1.bottom; - af.in.info.info1 = &form; - - status = dcerpc_spoolss_AddForm( - p, mem_ctx, &af); - } } return True; @@ -209,6 +189,66 @@ BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, char *formname) +{ + NTSTATUS status; + struct spoolss_DeleteForm r; + + r.in.handle = handle; + r.in.formname = formname; + + status = dcerpc_spoolss_DeleteForm(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { + printf("DeleteForm failed - %s/%s\n", + nt_errstr(status), win_errstr(r.out.result)); + return False; + } + + return True; +} + +BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + struct spoolss_AddForm r; + struct spoolss_AddFormInfo1 form; + NTSTATUS status; + char *formname = "testform3"; + + r.in.handle = handle; + r.in.level = 1; + form.flags = 2; /* User form */ + form.name = formname; + form.width = 1; + form.length = 2; + form.left = 3; + form.top = 4; + form.right = 5; + form.bottom = 6; + r.in.info.info1 = &form; + + status = dcerpc_spoolss_AddForm(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("AddForm failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("AddForm failed - %s\n", nt_errstr(status)); + /* Fall through to delete form */ + } + + if (!test_DeleteForm(p, mem_ctx, handle, formname)) { + printf("DeleteForm failed\n"); + return False; + } + + return True; +} + BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { @@ -338,6 +378,10 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_AddForm(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_EnumPrinterData(p, mem_ctx, &handle)) { ret = False; } -- cgit From abff8aac56b2481de2223bf43ae2098cc7ab2391 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Thu, 27 Nov 2003 20:55:13 +0000 Subject: Implemented SetForm RPC. (This used to be commit bdb0dfc370b4deb9e7f5a381092538c3e502f191) --- source4/torture/rpc/spoolss.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 468484e471..c355b8d9bc 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -216,6 +216,7 @@ BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_AddFormInfo1 form; NTSTATUS status; char *formname = "testform3"; + BOOL ret = True; r.in.handle = handle; r.in.level = 1; @@ -238,15 +239,35 @@ BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, if (!W_ERROR_IS_OK(r.out.result)) { printf("AddForm failed - %s\n", nt_errstr(status)); - /* Fall through to delete form */ + goto done; } + { + struct spoolss_SetForm sf; + + sf.in.handle = handle; + sf.in.form_name = formname; + sf.in.level = 1; + sf.in.info.info1 = &form; + form.width = 1234; + + status = dcerpc_spoolss_SetForm(p, mem_ctx, &sf); + + if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { + printf("SetForm failed - %s/%s\n", + nt_errstr(status), win_errstr(r.out.result)); + ret = False; + /* Fall through to delete */ + } + } + + done: if (!test_DeleteForm(p, mem_ctx, handle, formname)) { printf("DeleteForm failed\n"); - return False; + ret = False; } - return True; + return ret; } BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, -- cgit From d419464d87127c9464d1a00976a36774835d196d Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 28 Nov 2003 05:02:32 +0000 Subject: Added EnumJobs, GetJob, SetJob RPCs. (This used to be commit a06cbbbf1fa1e873bb13bc86d14694b2af791e22) --- source4/torture/rpc/spoolss.c | 137 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c355b8d9bc..b32250f22e 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -270,6 +270,139 @@ BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return ret; } +BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, uint32 job_id) +{ + NTSTATUS status; + struct spoolss_GetJob r; + uint32 buf_size; + + r.in.handle = handle; + r.in.job_id = job_id; + r.in.level = 1; + r.in.buffer = NULL; + buf_size = 0; + r.in.buf_size = r.out.buf_size = &buf_size; + + printf("Testing GetJob\n"); + + status = dcerpc_spoolss_GetJob(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("GetJob failed - %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size); + + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_GetJob(p, mem_ctx, &r); + + if (!r.out.info) { + printf("No job info returned"); + return False; + } + } + + return True; +} + +BOOL test_SetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, uint32 job_id, uint32 command) +{ + NTSTATUS status; + struct spoolss_SetJob r; + + r.in.handle = handle; + r.in.job_id = job_id; + r.in.level = 0; + r.in.command = command; + + printf("Testing SetJob\n"); + + status = dcerpc_spoolss_SetJob(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("SetJob failed - %s\n", nt_errstr(status)); + return False; + } + + return True; +} + +BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct spoolss_EnumJobs r; + uint32 buf_size; + + r.in.handle = handle; + r.in.firstjob = 0; + r.in.numjobs = 0xffffffff; + r.in.level = 1; + r.in.buffer = NULL; + buf_size = 0; + r.in.buf_size = &buf_size; + r.out.buf_size = &buf_size; + + printf("Testing EnumJobs\n"); + + status = dcerpc_spoolss_EnumJobs(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumJobs failed - %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size); + union spoolss_JobInfo *info; + int j; + + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_EnumJobs(p, mem_ctx, &r); + + if (!r.out.buffer) { + printf("No jobs returned"); + return True; + } + + status = pull_spoolss_JobInfoArray( + r.out.buffer, mem_ctx, r.in.level, r.out.count, + &info); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumJobsArray parse failed - %s\n", + nt_errstr(status)); + return False; + } + + for (j = 0; j < r.out.count; j++) { + printf("Job %d\n", j); + NDR_PRINT_UNION_DEBUG( + spoolss_JobInfo, r.in.level, &info[j]); + } + + for (j = 0; j < r.out.count; j++) { + test_GetJob(p, mem_ctx, handle, info[j].info1.job_id); + test_SetJob( + p, mem_ctx, handle, info[j].info1.job_id, 1); + } + + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumJobs failed - %s\n", win_errstr(r.out.result)); + return False; + } + + return True; +} + BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { @@ -407,6 +540,10 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_EnumJobs(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } -- cgit From b0ba0462a4e85a26c45a4e763655d5b3885a147f Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 28 Nov 2003 06:39:06 +0000 Subject: Fix bug in EnumPrinterData test. Implement GetPrinterData RPC. (This used to be commit 270c4fe389fb67ccbe0b9174267b40738ca43052) --- source4/torture/rpc/spoolss.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index b32250f22e..4d729fdf89 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -403,6 +403,41 @@ BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, char *value_name) +{ + NTSTATUS status; + struct spoolss_GetPrinterData r; + uint32 buf_size; + + r.in.handle = handle; + r.in.value_name = value_name; + buf_size = 0; + r.in.buf_size = r.out.buf_size = &buf_size; + + printf("Testing GetPrinterData\n"); + + status = dcerpc_spoolss_GetPrinterData(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("GetPrinterData failed - %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { + + status = dcerpc_spoolss_GetPrinterData(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinterData failed - %s/%s\n", + nt_errstr(status), win_errstr(r.out.result)); + return False; + } + } + + return True; +} + BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { @@ -438,8 +473,11 @@ BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } + test_GetPrinterData(p, mem_ctx, handle, r.out.value_name); + r.in.enum_index++; - } while (!W_ERROR_IS_OK(r.out.result)); + + } while (W_ERROR_IS_OK(r.out.result)); return True; } -- cgit From f83f0cb0605368387358782179460ca4d75a9541 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 28 Nov 2003 09:05:44 +0000 Subject: fixed some warnings (This used to be commit 1c2b8a93c50e3d5485732a2f06847166e883f939) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 4d729fdf89..fc6cbae135 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -215,7 +215,7 @@ BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_AddForm r; struct spoolss_AddFormInfo1 form; NTSTATUS status; - char *formname = "testform3"; + const char *formname = "testform3"; BOOL ret = True; r.in.handle = handle; -- cgit From d55fc1c9f28414a0182e571d5b5d60b4a3d2b1d9 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 28 Nov 2003 10:34:58 +0000 Subject: Add SetPrinterData, DeletePrinterData. (This used to be commit ea534f82d0620cbda5a960e492ec2fc1702fe975) --- source4/torture/rpc/spoolss.c | 54 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index fc6cbae135..bd89663c57 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -482,6 +482,56 @@ BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, char *value_name) +{ + NTSTATUS status; + struct spoolss_DeletePrinterData r; + + r.in.handle = handle; + r.in.value_name = value_name; + + printf("Testing DeletePrinterData\n"); + + status = dcerpc_spoolss_DeletePrinterData(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("DeletePrinterData failed - %s\n", nt_errstr(status)); + return False; + } + + return True; +} + +BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct spoolss_SetPrinterData r; + char *value_name = "spottyfoot"; + + r.in.handle = handle; + r.in.value_name = value_name; + r.in.type = 0; + r.in.buffer = data_blob_talloc(mem_ctx, "dog", 4); + r.in.real_len = 4; + + printf("Testing SetPrinterData\n"); + + status = dcerpc_spoolss_SetPrinterData(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("SetPrinterData failed - %s\n", nt_errstr(status)); + return False; + } + + if (!test_DeletePrinterData(p, mem_ctx, handle, value_name)) { + return False; + } + + return True; +} + static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *name) { @@ -582,6 +632,10 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_SetPrinterData(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } -- cgit From 2bb7ff5915bf349e1420152b2be7f297424c7ec6 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 28 Nov 2003 11:50:33 +0000 Subject: GetPrinterDataEx, SetPrinterDataEx, DeletePrinterDataEx. (This used to be commit e8367f57356bc3da78a6217158f9d639ba4ca5fa) --- source4/torture/rpc/spoolss.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index bd89663c57..802671c8e8 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -438,6 +438,43 @@ BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, char *key_name, + char *value_name) +{ + NTSTATUS status; + struct spoolss_GetPrinterDataEx r; + uint32 buf_size; + + r.in.handle = handle; + r.in.key_name = key_name; + r.in.value_name = value_name; + buf_size = 0; + r.in.buf_size = r.out.buf_size = &buf_size; + + printf("Testing GetPrinterDataEx\n"); + + status = dcerpc_spoolss_GetPrinterDataEx(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("GetPrinterDataEx failed - %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { + + status = dcerpc_spoolss_GetPrinterDataEx(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinterDataEx failed - %s/%s\n", + nt_errstr(status), win_errstr(r.out.result)); + return False; + } + } + + return True; +} + BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { @@ -475,6 +512,10 @@ BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, test_GetPrinterData(p, mem_ctx, handle, r.out.value_name); + test_GetPrinterDataEx( + p, mem_ctx, handle, "PrinterDriverData", + r.out.value_name); + r.in.enum_index++; } while (W_ERROR_IS_OK(r.out.result)); -- cgit From d944b9780a132cb6c16571192f5cea8bd7b03f25 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sun, 30 Nov 2003 11:57:40 +0000 Subject: Added EnumPrinterDriver, GetPrinterDriver (still in progress) (This used to be commit a818439b5915fd70b8aa3d3045f658b3f59a6bea) --- source4/torture/rpc/spoolss.c | 169 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 159 insertions(+), 10 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 802671c8e8..2be1ddc0a2 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -612,23 +612,26 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return ret; } -static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - const char *name) +static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + const char *name, struct policy_handle *handle) { - struct policy_handle handle; struct spoolss_OpenPrinterEx r; struct spoolss_UserLevel1 userlevel1; NTSTATUS status; - BOOL ret = True; - r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", - dcerpc_server_name(p), name); + if (name && name[0]) + r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", + dcerpc_server_name(p), name); + else + r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s", + dcerpc_server_name(p)); + r.in.datatype = NULL; r.in.devmode_ctr.size = 0; r.in.devmode_ctr.devmode = NULL; r.in.access_required = 0x02000000; r.in.level = 1; - r.out.handle = &handle; + r.out.handle = handle; userlevel1.size = 1234; userlevel1.client = "hello"; @@ -647,12 +650,25 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("OpenPrinterEx failed - %s\n", nt_errstr(status)); return False; } - + if (!W_ERROR_IS_OK(r.out.result)) { printf("OpenPrinterEx failed - %s\n", win_errstr(r.out.result)); return False; } + return True; +} + +static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + const char *name) +{ + struct policy_handle handle; + BOOL ret = True; + + if (!call_OpenPrinterEx(p, mem_ctx, name, &handle)) { + return False; + } + if (!test_GetPrinter(p, mem_ctx, &handle)) { ret = False; } @@ -680,11 +696,10 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } - + return ret; } - static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; @@ -763,6 +778,136 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) return ret; } +static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle, char *driver_name) +{ + NTSTATUS status; + struct spoolss_GetPrinterDriver2 r; + uint32 buf_size; + + r.in.handle = handle; + r.in.architecture = "W32X86"; + r.in.level = 1; + buf_size = 0; + r.in.buf_size = r.out.buf_size = &buf_size; + r.in.client_major_version = 0; + r.in.client_minor_version = 0; + + printf("Testing GetPrinterDriver2\n"); + + status = dcerpc_spoolss_GetPrinterDriver2(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("GetPrinterDriver2 failed - %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + status = dcerpc_spoolss_GetPrinterDriver2(p, mem_ctx, &r); + } + + if (!NT_STATUS_IS_OK(status) || + !W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinterDriver2 failed - %s/%s\n", + nt_errstr(status), win_errstr(r.out.result)); + return False; + } + + return True; +} + +static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +{ + struct spoolss_EnumPrinterDrivers r; + NTSTATUS status; + uint16 levels[] = {1, 2, 3}; + int i; + BOOL ret = True; + + for (i=0;i Date: Sun, 30 Nov 2003 23:40:04 +0000 Subject: * removed a bunch of unused code * made some functions static (This used to be commit 829b87f30d5f4cc7174b716f3354982d84af4818) --- source4/torture/rpc/spoolss.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 2be1ddc0a2..14cfbd0d29 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -21,7 +21,7 @@ #include "includes.h" -BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { NTSTATUS status; @@ -67,7 +67,7 @@ BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } -BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { NTSTATUS status; @@ -87,7 +87,7 @@ BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, char *formname) { NTSTATUS status; @@ -127,7 +127,7 @@ BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { NTSTATUS status; @@ -189,7 +189,7 @@ BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, char *formname) { NTSTATUS status; @@ -209,7 +209,7 @@ BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { struct spoolss_AddForm r; @@ -270,7 +270,7 @@ BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return ret; } -BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, uint32 job_id) { NTSTATUS status; @@ -310,7 +310,7 @@ BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_SetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_SetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, uint32 job_id, uint32 command) { NTSTATUS status; @@ -333,7 +333,7 @@ BOOL test_SetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { NTSTATUS status; @@ -403,7 +403,7 @@ BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, char *value_name) { NTSTATUS status; @@ -438,7 +438,7 @@ BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, char *key_name, char *value_name) { @@ -475,7 +475,7 @@ BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { NTSTATUS status; @@ -523,7 +523,7 @@ BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, char *value_name) { NTSTATUS status; @@ -544,7 +544,7 @@ BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { NTSTATUS status; -- cgit From 8ae5b50a6e787767bc00d42533ca29d8fb136e2e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 20 Jan 2004 06:07:09 +0000 Subject: added code to the RPC-SPOOLSS test that demonstrates that policy handles are not shared between open dcerpc connections, even when those connections are on the same SMB socket. I have tested this with w2k3, w2k and NT4. It seems that policy handles have a strict scope of the dcerpc connection on which they were opened. I realise that this goes against existing folk-law in the team, but it seems that the previous testing (I'm not sure who did this?) was wrong. Perhaps clients do send us policy handles from other connections, but if they do then the correct thing to do is to fail the operation with a dcerpc fault. I suspect that failing it with exactly the right dcerpc fault code is important. (This used to be commit 2ed24d29bafd9055d5782acdd595cd0f378a651a) --- source4/torture/rpc/spoolss.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 14cfbd0d29..5b118bec7b 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -573,6 +573,39 @@ static BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct dcerpc_pipe *p2; + + /* only makes sense on SMB */ + if (p->transport.transport != NCACN_NP) { + return True; + } + + printf("testing close on secondary pipe\n"); + + status = dcerpc_secondary_smb(p, &p2, + DCERPC_SPOOLSS_NAME, + DCERPC_SPOOLSS_UUID, + DCERPC_SPOOLSS_VERSION); + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to create secondary connection\n"); + return False; + } + + if (test_ClosePrinter(p2, mem_ctx, handle)) { + printf("ERROR: Allowed close on secondary connection!\n"); + dcerpc_pipe_close(p2); + return False; + } + + dcerpc_pipe_close(p2); + + return True; +} + static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *name) { @@ -605,6 +638,10 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_SecondaryClosePrinter(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } @@ -693,6 +730,10 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_SecondaryClosePrinter(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } -- cgit From 53382d54f4e98d49dd447da85d1978df632045ea Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 20 Jan 2004 06:10:15 +0000 Subject: check for the correct fault code when the server fails a use of a incorrect policy handle (This used to be commit 8cd6e90eb8716ba43f5940245d7be580aab4ba83) --- source4/torture/rpc/spoolss.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 5b118bec7b..08c486f45a 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -578,6 +578,7 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct { NTSTATUS status; struct dcerpc_pipe *p2; + BOOL ret = True; /* only makes sense on SMB */ if (p->transport.transport != NCACN_NP) { @@ -597,13 +598,18 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct if (test_ClosePrinter(p2, mem_ctx, handle)) { printf("ERROR: Allowed close on secondary connection!\n"); - dcerpc_pipe_close(p2); - return False; + ret = False; + } + + if (p2->last_fault_code != DCERPC_FAULT_CONTEXT_MISMATCH) { + printf("Unexpected fault code 0x%x - expected 0x%x\n", + p2->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH); + ret = False; } dcerpc_pipe_close(p2); - return True; + return ret; } static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, -- cgit From 0b4da9d7e069a5e32d9706ee12cde7fe7625270d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 3 Feb 2004 14:56:07 +0000 Subject: - add 'print' to the DCERPC binding strings e.g. ncacn_np:myserver:[samr,sign,print] will now enable the packet debugging and the debugging is not bound anymore to the debuglevel >= 2 in the torture tests - also the dcesrv_remote module now supports debugging of the packets use the 'dcerpc_remote:binding' smb.conf parameter. metze (This used to be commit 40abf3c584efed7f977ddd688ea064540e5a5b13) --- source4/torture/rpc/spoolss.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 08c486f45a..e416c18f90 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -972,8 +972,6 @@ BOOL torture_rpc_spoolss(int dummy) return False; } - p->flags |= DCERPC_DEBUG_PRINT_BOTH; - if (!test_EnumPrinters(p, mem_ctx)) { ret = False; } -- cgit From f9d8f8843dc0ab8c9d59abde7222e0f118b86b5d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 25 May 2004 16:24:13 +0000 Subject: r884: convert samba4 to use [u]int32_t instead of [u]int32 metze (This used to be commit 0e5517d937a2eb7cf707991d1c7498c1ab456095) --- source4/torture/rpc/spoolss.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e416c18f90..6e6d325ab0 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -31,7 +31,7 @@ static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, BOOL ret = True; for (i=0;i Date: Tue, 25 May 2004 17:24:24 +0000 Subject: r889: convert samba4 to use [u]int16_t instead of [u]int16 metze (This used to be commit af6f1f8a01bebbecd99bc8c066519e89966e65e3) --- source4/torture/rpc/spoolss.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 6e6d325ab0..74860cd369 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -26,7 +26,7 @@ static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, { NTSTATUS status; struct spoolss_GetPrinter r; - uint16 levels[] = {1, 2, 3, 4, 5, 6, 7}; + uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7}; int i; BOOL ret = True; @@ -751,7 +751,7 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; NTSTATUS status; - uint16 levels[] = {1, 2, 4, 5}; + uint16_t levels[] = {1, 2, 4, 5}; int i; BOOL ret = True; @@ -867,7 +867,7 @@ static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinterDrivers r; NTSTATUS status; - uint16 levels[] = {1, 2, 3}; + uint16_t levels[] = {1, 2, 3}; int i; BOOL ret = True; -- cgit From a1318baa5503648ffcff2e9cd625b6848ad285b8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 6 Jun 2004 07:14:10 +0000 Subject: r1041: - pulled the domain join code out of the netlogon test and made it a separate utility function, to allow multiple torture tests to temporarily join a domain - fixed a session key size problem - added a schannel test suite - allow schannel to work with ncacn_ip_tcp (This used to be commit 36f05e4d575099fcb957b8a55781c38dcd2e1177) --- source4/torture/rpc/spoolss.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 74860cd369..cbeaac8d9e 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -587,10 +587,10 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct printf("testing close on secondary pipe\n"); - status = dcerpc_secondary_smb(p, &p2, - DCERPC_SPOOLSS_NAME, - DCERPC_SPOOLSS_UUID, - DCERPC_SPOOLSS_VERSION); + status = dcerpc_secondary_connection(p, &p2, + DCERPC_SPOOLSS_NAME, + DCERPC_SPOOLSS_UUID, + DCERPC_SPOOLSS_VERSION); if (!NT_STATUS_IS_OK(status)) { printf("Failed to create secondary connection\n"); return False; -- cgit From 5f6c0b6c8cd2db9cd5a93dcdd2697be2a7acf6c5 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 3 Sep 2004 13:20:31 +0000 Subject: r2207: this bug caued valgrind to consume infinite memory till the kernel killed it :( (This used to be commit 60a88595e23eb2953edfacf9dfc9fe3f08ec5eeb) --- source4/torture/rpc/spoolss.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index cbeaac8d9e..34221a14fa 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -836,6 +836,7 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.architecture = "W32X86"; r.in.level = 1; buf_size = 0; + r.in.buffer = NULL; r.in.buf_size = r.out.buf_size = &buf_size; r.in.client_major_version = 0; r.in.client_minor_version = 0; -- cgit From 13f44bbacb120703910cf48233444c357ccfd228 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 3 Sep 2004 13:36:58 +0000 Subject: r2209: patch from volker to add EnumPorts spoolss IDL and test code the ndr->offset=0; stuff is ugly. We need a better way to handle this. (This used to be commit e909bfa708aeceeaa37faa6f6dff0274f8ac7920) --- source4/torture/rpc/spoolss.c | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 34221a14fa..e3299b54db 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -270,6 +270,68 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return ret; } +static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +{ + NTSTATUS status; + struct spoolss_EnumPorts r; + uint32_t buf_size; + + r.in.servername = talloc_asprintf(mem_ctx, "\\\\%s", + dcerpc_server_name(p)); + r.in.level = 2; + r.in.buffer = NULL; + buf_size = 0; + r.in.buf_size = &buf_size; + r.out.buf_size = &buf_size; + + printf("Testing EnumPorts\n"); + + status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPorts failed -- %s\n", nt_errstr(status)); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size); + union spoolss_PortInfo *info; + int j; + + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPorts failed -- %s\n", nt_errstr(status)); + return False; + } + + if (!r.out.buffer) { + printf("No ports returned"); + return False; + } + + status = pull_spoolss_PortInfoArray(r.out.buffer, mem_ctx, + r.in.level, r.out.count, + &info); + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPortArray parse failed - %s\n", + nt_errstr(status)); + return False; + } + + for (j=0;j Date: Mon, 25 Oct 2004 15:19:19 +0000 Subject: r3218: Fix the build (This used to be commit 478ba629158e8ce5e15467105b1013ba60f04ec1) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e3299b54db..f0748fc7d9 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -734,7 +734,7 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.datatype = NULL; r.in.devmode_ctr.size = 0; r.in.devmode_ctr.devmode = NULL; - r.in.access_required = 0x02000000; + r.in.access_mask = 0x02000000; r.in.level = 1; r.out.handle = handle; -- cgit From 4a25682214d15ff79ffc31665333873eab84a89c Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 28 Oct 2004 08:37:46 +0000 Subject: r3317: Fix the build (This used to be commit 5e8fd27d6ec7f44e6e802a2f29ec54e96fa78af0) --- source4/torture/rpc/spoolss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index f0748fc7d9..db0f1bc1a9 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -177,7 +177,7 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } for (j = 0; j < r.out.count; j++) - test_GetForm(p, mem_ctx, handle, info[j].info1.name); + test_GetForm(p, mem_ctx, handle, info[j].info1.formname); } if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { @@ -221,7 +221,7 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.handle = handle; r.in.level = 1; form.flags = 2; /* User form */ - form.name = formname; + form.formname = formname; form.width = 1; form.length = 2; form.left = 3; -- cgit From ba6d5fcb97b9831dddf7dfe09fb02fbb23d864b4 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 28 Oct 2004 13:40:50 +0000 Subject: r3324: made the smbtorture code completely warning free (This used to be commit 7067bb9b52223cafa28470f264f0b60646a07a01) --- source4/torture/rpc/spoolss.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index db0f1bc1a9..939c13a937 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -88,7 +88,8 @@ static BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle, char *formname) + struct policy_handle *handle, + const char *formname) { NTSTATUS status; struct spoolss_GetForm r; @@ -190,7 +191,8 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle, char *formname) + struct policy_handle *handle, + const char *formname) { NTSTATUS status; struct spoolss_DeleteForm r; @@ -466,7 +468,8 @@ static BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle, char *value_name) + struct policy_handle *handle, + const char *value_name) { NTSTATUS status; struct spoolss_GetPrinterData r; @@ -501,8 +504,9 @@ static BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle, char *key_name, - char *value_name) + struct policy_handle *handle, + const char *key_name, + const char *value_name) { NTSTATUS status; struct spoolss_GetPrinterDataEx r; @@ -586,7 +590,8 @@ static BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle, char *value_name) + struct policy_handle *handle, + const char *value_name) { NTSTATUS status; struct spoolss_DeletePrinterData r; @@ -611,8 +616,8 @@ static BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, { NTSTATUS status; struct spoolss_SetPrinterData r; - char *value_name = "spottyfoot"; - + const char *value_name = "spottyfoot"; + r.in.handle = handle; r.in.value_name = value_name; r.in.type = 0; @@ -888,7 +893,8 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle, char *driver_name) + struct policy_handle *handle, + const char *driver_name) { NTSTATUS status; struct spoolss_GetPrinterDriver2 r; @@ -1018,7 +1024,7 @@ static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) return ret; } -BOOL torture_rpc_spoolss(int dummy) +BOOL torture_rpc_spoolss(void) { NTSTATUS status; struct dcerpc_pipe *p; -- cgit From 89665e87b47e5cc3299c3234bf3c8b0266f9bab2 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 30 Oct 2004 23:35:34 +0000 Subject: r3396: Rename form_name -> formname. This time, check smbtorture builds before committing. (-: (This used to be commit c776232d0130638a85cc8ce75e4bbef75952e856) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 939c13a937..3156ac7b3b 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -248,7 +248,7 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_SetForm sf; sf.in.handle = handle; - sf.in.form_name = formname; + sf.in.formname = formname; sf.in.level = 1; sf.in.info.info1 = &form; form.width = 1234; -- cgit From 90067934cd3195df80f8b1e614629d51fffcb38b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 1 Nov 2004 10:30:34 +0000 Subject: r3428: switched to using minimal includes for the auto-generated RPC code. The thing that finally convinced me that minimal includes was worth pursuing for rpc was a compiler (tcc) that failed to build Samba due to reaching internal limits of the size of include files. Also the fact that includes.h.gch was 16MB, which really seems excessive. This patch brings it back to 12M, which is still too large, but better. Note that this patch speeds up compile times for both the pch and non-pch case. This change also includes the addition iof a "depends()" option in our IDL files, allowing you to specify that one IDL file depends on another. This capability was needed for the auto-includes generation. (This used to be commit b8f5fa8ac8e8725f3d321004f0aedf4246fc6b49) --- source4/torture/rpc/spoolss.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 3156ac7b3b..7d1718acaf 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -20,6 +20,7 @@ */ #include "includes.h" +#include "librpc/gen_ndr/ndr_spoolss.h" static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) -- cgit From cc8f4358cca2404895015e2351394f2f4a16e025 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 2 Dec 2004 04:37:36 +0000 Subject: r4035: more effort on consistent naming of the access mask bits. This removes the duplicate named SEC_RIGHTS_MAXIMUM_ALLOWED and SEC_RIGHTS_FULL_CONTROL, which are just other names for SEC_FLAG_MAXIMUM_ALLOWED and SEC_RIGHTS_FILE_ALL. The latter names match the new naming conventions in security.idl Also added names for the generic->specific mappings for files are directories (This used to be commit 17a4e0b3aca227b40957ed1e0c57e498debc6ddf) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 7d1718acaf..bfd03810c2 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -694,7 +694,7 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.server = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name); r.in.printer = NULL; r.in.buffer = &blob; - r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; + r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.out.handle = &handle; printf("\nTesting OpenPrinter(\\\\%s)\n", r.in.server); -- cgit From 6836f5d0b167027908da9a08b9b219520997b563 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 9 Jan 2005 08:34:05 +0000 Subject: r4616: the first phase in the addition of proper support for dcerpc_alter_context and multiple context_ids in the dcerpc client library. This stage does the following: - split "struct dcerpc_pipe" into two parts, the main part being "struct dcerpc_connection", which contains all the parts not dependent on the context, and "struct dcerpc_pipe" which has the context dependent part. This is similar to the layering in libcli_*() for SMB - disable the current dcerpc_alter code. I've used a #warning until i get the 2nd phase finished. I don't know how portable #warning is, but it won't be long before I add full alter context support anyway, so it won't last long - cleanup the allocation of dcerpc_pipe structures. The previous code was quite awkward. (This used to be commit 4004c69937be7e5dae56f9567ca607f982d395d3) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index bfd03810c2..6f2edf9f47 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -649,7 +649,7 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct BOOL ret = True; /* only makes sense on SMB */ - if (p->transport.transport != NCACN_NP) { + if (p->conn->transport.transport != NCACN_NP) { return True; } -- cgit From 759da3b915e2006d4c87b5ace47f399accd9ce91 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 27 Jan 2005 07:08:20 +0000 Subject: r5037: got rid of all of the TALLOC_DEPRECATED stuff. My apologies for the large commit. I thought this was worthwhile to get done for consistency. (This used to be commit ec32b22ed5ec224f6324f5e069d15e92e38e15c0) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 6f2edf9f47..c11a004e33 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1054,7 +1054,7 @@ BOOL torture_rpc_spoolss(void) ret = False; } - talloc_destroy(mem_ctx); + talloc_free(mem_ctx); torture_rpc_close(p); -- cgit From 6b4cac2c00bd77c34bfe47f35729a60782b8c9c2 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 21 Feb 2005 13:54:06 +0000 Subject: r5489: hide handwritten pull/push/print code from the caller for the spoolss_Enum* functions metze (This used to be commit bfcc86e706cf32672323eda939e5def6694509a8) --- source4/torture/rpc/spoolss.c | 125 +++++++++--------------------------------- 1 file changed, 27 insertions(+), 98 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c11a004e33..8e4ea15677 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -162,24 +162,16 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_EnumForms(p, mem_ctx, &r); - if (!r.out.buffer) { + if (!r.out.info) { printf("No forms returned"); return False; } - status = pull_spoolss_FormInfoArray(r.out.buffer, mem_ctx, r.in.level, r.out.count, &info); - if (!NT_STATUS_IS_OK(status)) { - printf("EnumFormsArray parse failed - %s\n", nt_errstr(status)); - return False; - } - - for (j=0;j Date: Tue, 22 Feb 2005 08:04:52 +0000 Subject: r5498: fix OpenPrinter() idl and torture test metze (This used to be commit fd7950abe62e91108157619ace8e96e99110b668) --- source4/torture/rpc/spoolss.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 8e4ea15677..de8da366b7 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -646,18 +646,16 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, NTSTATUS status; struct spoolss_OpenPrinter r; struct policy_handle handle; - DATA_BLOB blob; BOOL ret = True; - blob = data_blob(NULL, 0); + r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name); + r.in.datatype = NULL; + r.in.devmode_ctr.size = 0; + r.in.devmode_ctr.devmode= NULL; + r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; + r.out.handle = &handle; - r.in.server = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name); - r.in.printer = NULL; - r.in.buffer = &blob; - r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; - r.out.handle = &handle; - - printf("\nTesting OpenPrinter(%s)\n", r.in.server); + printf("\nTesting OpenPrinter(%s)\n", r.in.printername); status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { @@ -667,7 +665,6 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } - if (!test_GetPrinter(p, mem_ctx, &handle)) { ret = False; } @@ -679,7 +676,7 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, if (!test_ClosePrinter(p, mem_ctx, &handle)) { ret = False; } - + return ret; } -- cgit From d900aed90c6383e9db6a0a51071c3c8622a53ba6 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 22 Feb 2005 11:51:18 +0000 Subject: r5503: - add torture test which tests for invalid printernames - add OpenPrinter() server code that just calls OpenPrinterEx() - fix OpenPrinterEx logic, we pass the invalid printer names test now metze (This used to be commit 3085d3728eaf76097319f648ab4bc7f9447bbe10) --- source4/torture/rpc/spoolss.c | 115 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 95 insertions(+), 20 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index de8da366b7..c7a0a1e066 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -640,6 +640,85 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct return ret; } +static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *name) +{ + NTSTATUS status; + struct spoolss_OpenPrinter op; + struct spoolss_OpenPrinterEx opEx; + struct policy_handle handle; + BOOL ret = True; + + op.in.printername = name; + op.in.datatype = NULL; + op.in.devmode_ctr.size = 0; + op.in.devmode_ctr.devmode= NULL; + op.in.access_mask = 0; + op.out.handle = &handle; + + printf("\nTesting OpenPrinter(%s) with bad name\n", op.in.printername); + + status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &op); + if (!NT_STATUS_IS_OK(status)) { + printf("OpenPrinter failed - %s\n", nt_errstr(status)); + ret = False; + } + if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,op.out.result)) { + printf("OpenPrinter(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", + name, win_errstr(op.out.result)); + } + + if (W_ERROR_IS_OK(op.out.result)) { + ret &=test_ClosePrinter(p, mem_ctx, &handle); + } + + opEx.in.printername = name; + opEx.in.datatype = NULL; + opEx.in.devmode_ctr.size = 0; + opEx.in.devmode_ctr.devmode = NULL; + opEx.in.access_mask = 0; + opEx.in.level = 1; + opEx.in.userlevel.level1 = NULL; + opEx.out.handle = &handle; + + printf("\nTesting OpenPrinter(%s) with bad name\n", opEx.in.printername); + + status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &opEx); + if (!NT_STATUS_IS_OK(status)) { + printf("OpenPrinter failed - %s\n", nt_errstr(status)); + ret = False; + } + if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,opEx.out.result)) { + printf("OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", + name, win_errstr(opEx.out.result)); + } + + if (W_ERROR_IS_OK(opEx.out.result)) { + ret &=test_ClosePrinter(p, mem_ctx, &handle); + } + + return ret; +} + +static BOOL test_OpenPrinter_badnames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +{ + BOOL ret = True; + char *name; + + ret &= test_OpenPrinter_badname(p, mem_ctx, "__INVALID_PRINTER__"); + ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\127.0.0.1"); + ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\localhost"); + + name = talloc_asprintf(mem_ctx, "\\\\%s\\", dcerpc_server_name(p)); + ret &= test_OpenPrinter_badname(p, mem_ctx, name); + talloc_free(name); + + name = talloc_asprintf(mem_ctx, "\\\\%s\\__INVALID_PRINTER__", dcerpc_server_name(p)); + ret &= test_OpenPrinter_badname(p, mem_ctx, name); + talloc_free(name); + + return ret; +} + static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *name) { @@ -661,8 +740,7 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { printf("OpenPrinter failed - %s/%s\n", nt_errstr(status), win_errstr(r.out.result)); - /* don't consider failing this an error until we understand it */ - return True; + return False; } if (!test_GetPrinter(p, mem_ctx, &handle)) { @@ -687,18 +765,20 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_UserLevel1 userlevel1; NTSTATUS status; - if (name && name[0]) + if (name && name[0]) { r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name); - else + } else { r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); + } - r.in.datatype = NULL; - r.in.devmode_ctr.size = 0; - r.in.devmode_ctr.devmode = NULL; - r.in.access_mask = 0x02000000; - r.in.level = 1; + r.in.datatype = NULL; + r.in.devmode_ctr.size = 0; + r.in.devmode_ctr.devmode= NULL; + r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; + r.in.level = 1; + r.in.userlevel.level1 = &userlevel1; r.out.handle = handle; userlevel1.size = 1234; @@ -708,7 +788,6 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, userlevel1.major = 2; userlevel1.minor = 3; userlevel1.processor = 4; - r.in.userlevel.level1 = &userlevel1; printf("Testing OpenPrinterEx(%s)\n", r.in.printername); @@ -968,18 +1047,14 @@ BOOL torture_rpc_spoolss(void) mem_ctx = talloc_init("torture_rpc_spoolss"); - if (!test_EnumPorts(p, mem_ctx)) { - ret = False; - } + ret &= test_OpenPrinter_badnames(p, mem_ctx); - if (!test_EnumPrinters(p, mem_ctx)) { - ret = False; - } + ret &= test_EnumPorts(p, mem_ctx); + + ret &= test_EnumPrinters(p, mem_ctx); + + ret &= test_EnumPrinterDrivers(p, mem_ctx); - if (!test_EnumPrinterDrivers(p, mem_ctx)) { - ret = False; - } -printf("blub\n"); talloc_free(mem_ctx); torture_rpc_close(p); -- cgit From 09879ff119838535a9c5daeb33f62c126b76fe25 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 23 Feb 2005 15:08:41 +0000 Subject: r5516: NT4 doesn't support GetPrinterDataEx() metze (This used to be commit 81f4afcbfa296f54634ba2a88e9ef3e966405fc3) --- source4/torture/rpc/spoolss.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c7a0a1e066..18b9e23b75 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -482,8 +482,12 @@ static BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("Testing GetPrinterDataEx\n"); status = dcerpc_spoolss_GetPrinterDataEx(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status)) { + if (NT_STATUS_EQUAL(status,NT_STATUS_NET_WRITE_FAULT) && + p->last_fault_code == DCERPC_FAULT_OP_RNG_ERROR) { + printf("GetPrinterDataEx not supported by server\n"); + return True; + } printf("GetPrinterDataEx failed - %s\n", nt_errstr(status)); return False; } -- cgit From 68ce448fbdbe9f7be3db6189110e46ce23aca18a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 24 Feb 2005 14:05:52 +0000 Subject: r5537: - make use of bitmaps and enums - add and fix some PrinterInfo levels - add and fix some DriverInfo levels - fix EnumPrinterDriver torture test the curent RPC-SPOOLSS now passes on w2k3 metze (This used to be commit 14b88ca20dc64702f1c1b457a09b1f13b1964654) --- source4/torture/rpc/spoolss.c | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 18b9e23b75..eb4b3c5da9 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -27,7 +27,7 @@ static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, { NTSTATUS status; struct spoolss_GetPrinter r; - uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7}; + uint16_t levels[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; int i; BOOL ret = True; @@ -684,7 +684,7 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, opEx.in.userlevel.level1 = NULL; opEx.out.handle = &handle; - printf("\nTesting OpenPrinter(%s) with bad name\n", opEx.in.printername); + printf("\nTesting OpenPrinterEx(%s) with bad name\n", opEx.in.printername); status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &opEx); if (!NT_STATUS_IS_OK(status)) { @@ -711,6 +711,7 @@ static BOOL test_OpenPrinter_badnames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx ret &= test_OpenPrinter_badname(p, mem_ctx, "__INVALID_PRINTER__"); ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\127.0.0.1"); ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\localhost"); + ret &= test_OpenPrinter_badname(p, mem_ctx, ""); name = talloc_asprintf(mem_ctx, "\\\\%s\\", dcerpc_server_name(p)); ret &= test_OpenPrinter_badname(p, mem_ctx, name); @@ -868,12 +869,12 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) union spoolss_PrinterInfo *info; int j; - r.in.flags = 0x02; - r.in.server = ""; - r.in.level = levels[i]; - r.in.buffer = NULL; - r.in.buf_size = &buf_size; - r.out.buf_size = &buf_size; + r.in.flags = PRINTER_ENUM_LOCAL; + r.in.server = ""; + r.in.level = levels[i]; + r.in.buffer = NULL; + r.in.buf_size = &buf_size; + r.out.buf_size = &buf_size; printf("\nTesting EnumPrinters level %u\n", r.in.level); @@ -883,14 +884,14 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) ret = False; continue; } - + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size); data_blob_clear(&blob); r.in.buffer = &blob; status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r); } - + if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { printf("EnumPrinters failed - %s/%s\n", @@ -920,10 +921,11 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } } } - + return ret; } +#if 0 static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, const char *driver_name) @@ -963,19 +965,18 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +#endif static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinterDrivers r; NTSTATUS status; - uint16_t levels[] = {1, 2, 3}; + uint16_t levels[] = {1, 2, 3, 4, 5, 6}; int i; BOOL ret = True; for (i=0;i Date: Thu, 24 Feb 2005 15:06:30 +0000 Subject: r5539: more bad name checks and don't check for \\localhost and \\127.0.0.1 we maybe use this in the build farm metze (This used to be commit 98e32260f5f4bf3b66fd9238c061618a3b49197c) --- source4/torture/rpc/spoolss.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index eb4b3c5da9..869b0abc6c 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -709,9 +709,10 @@ static BOOL test_OpenPrinter_badnames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx char *name; ret &= test_OpenPrinter_badname(p, mem_ctx, "__INVALID_PRINTER__"); - ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\127.0.0.1"); - ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\localhost"); + ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\__INVALID_HOST__"); ret &= test_OpenPrinter_badname(p, mem_ctx, ""); + ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\\\"); + ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\\\__INVALID_PRINTER__"); name = talloc_asprintf(mem_ctx, "\\\\%s\\", dcerpc_server_name(p)); ret &= test_OpenPrinter_badname(p, mem_ctx, name); -- cgit From 84d632ab5edfef0b7e7ca3ae6db983744f4e3fdf Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 25 Feb 2005 05:39:01 +0000 Subject: r5552: Don't try to read the value of r.out.result when the dcerpc client function returns non-OK. If a non-OK status is returned then some or all or r.out is likely to be uninitialised. (This used to be commit 0e83a306b06442a1adfe02ea6bdb727a42c7bacf) --- source4/torture/rpc/spoolss.c | 122 ++++++++++++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 35 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 869b0abc6c..7ca8db5a10 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -55,10 +55,15 @@ static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_GetPrinter(p, mem_ctx, &r); } - if (!NT_STATUS_IS_OK(status) || - !W_ERROR_IS_OK(r.out.result)) { - printf("GetPrinter failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("GetPrinter failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinter failed - %s\n", + win_errstr(r.out.result)); ret = False; continue; } @@ -174,9 +179,13 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } } - if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { - printf("EnumForms failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("EnumForms failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumForms failed - %s\n", win_errstr(r.out.result)); return False; } @@ -195,9 +204,13 @@ static BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_DeleteForm(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { - printf("DeleteForm failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("DeleteForm failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("DeleteForm failed - %s\n", win_errstr(r.out.result)); return False; } @@ -248,11 +261,17 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_SetForm(p, mem_ctx, &sf); - if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { - printf("SetForm failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("SetForm failed - %s\n", nt_errstr(status)); + ret = False; + goto done; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("SetForm failed - %s\n", + win_errstr(r.out.result)); ret = False; - /* Fall through to delete */ + goto done; } } @@ -454,9 +473,15 @@ static BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_GetPrinterData(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { - printf("GetPrinterData failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("GetPrinterData failed - %s\n", + nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinterData failed - %s\n", + win_errstr(r.out.result)); return False; } } @@ -496,9 +521,15 @@ static BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_GetPrinterDataEx(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { - printf("GetPrinterDataEx failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("GetPrinterDataEx failed - %s\n", + nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinterDataEx failed - %s\n", + win_errstr(r.out.result)); return False; } } @@ -743,9 +774,14 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("\nTesting OpenPrinter(%s)\n", r.in.printername); status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) { - printf("OpenPrinter failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + + if (!NT_STATUS_IS_OK(status)) { + printf("OpenPrinter failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("OpenPrinter failed - %s\n", win_errstr(r.out.result)); return False; } @@ -893,10 +929,15 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r); } - if (!NT_STATUS_IS_OK(status) || - !W_ERROR_IS_OK(r.out.result)) { - printf("EnumPrinters failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPrinters failed - %s\n", + nt_errstr(status)); + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumPrinters failed - %s\n", + win_errstr(r.out.result)); continue; } @@ -957,10 +998,15 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_GetPrinterDriver2(p, mem_ctx, &r); } - if (!NT_STATUS_IS_OK(status) || - !W_ERROR_IS_OK(r.out.result)) { - printf("GetPrinterDriver2 failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("GetPrinterDriver2 failed - %s\n", + nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinterDriver2 failed - %s\n", + win_errstr(r.out.result)); return False; } @@ -1007,10 +1053,16 @@ static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) status = dcerpc_spoolss_EnumPrinterDrivers(p, mem_ctx, &r); } - if (!NT_STATUS_IS_OK(status) || - !W_ERROR_IS_OK(r.out.result)) { - printf("EnumPrinterDrivers failed - %s/%s\n", - nt_errstr(status), win_errstr(r.out.result)); + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPrinterDrivers failed - %s\n", + nt_errstr(status)); + ret = False; + break; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumPrinterDrivers failed - %s\n", + win_errstr(r.out.result)); ret = False; break; } -- cgit From 04d3e8046a6276ddf968728998c9a57054faff22 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 25 Feb 2005 06:16:13 +0000 Subject: r5553: Add idl and test for spoolss_AddPort(). It always seems to return WERR_NOT_SUPPORTED though. (This used to be commit ba4730a37838f45db1b77b777af8efdb45a06006) --- source4/torture/rpc/spoolss.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 7ca8db5a10..94ced04a98 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -303,7 +303,7 @@ static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { - printf("EnumPorts failed -- %s\n", nt_errstr(status)); + printf("EnumPorts failed - %s\n", nt_errstr(status)); return False; } @@ -316,7 +316,7 @@ static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { - printf("EnumPorts failed -- %s\n", nt_errstr(status)); + printf("EnumPorts failed - %s\n", nt_errstr(status)); return False; } @@ -329,6 +329,39 @@ static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) return True; } +static BOOL test_AddPort(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +{ + NTSTATUS status; + struct spoolss_AddPort r; + + r.in.server_name = talloc_asprintf(mem_ctx, "\\\\%s", + dcerpc_server_name(p)); + r.in.unknown = 0; + r.in.monitor_name = "foo"; + + printf ("Testing AddPort\n"); + + status = dcerpc_spoolss_AddPort(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("AddPort failed - %s\n", nt_errstr(status)); + return False; + } + + /* win2k3 returns WERR_NOT_SUPPORTED */ + +#if 0 + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("AddPort failed - %s\n", win_errstr(r.out.result)); + return False; + } + +#endif + + return True; +} + static BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, uint32_t job_id) { @@ -1095,6 +1128,8 @@ BOOL torture_rpc_spoolss(void) ret &= test_OpenPrinter_badnames(p, mem_ctx); + ret &= test_AddPort(p, mem_ctx); + ret &= test_EnumPorts(p, mem_ctx); ret &= test_EnumPrinters(p, mem_ctx); -- cgit From 0dcd79b92ac2ad9ba1c60bf0c2cfb4e9e57cf3d1 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 2 Mar 2005 00:15:06 +0000 Subject: r5611: Add EnumPrinterDataEx-test (for now just for PrinterDriverData, we need to enumerate (recursively!) over all keys with EnumPrinterKey later on. Guenther (This used to be commit 46ae4010f2293fb1933aacd2da582fcb1c0a5e1d) --- source4/torture/rpc/spoolss.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 94ced04a98..7a9d8c3635 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -571,7 +571,7 @@ static BOOL test_GetPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle) + struct policy_handle *handle) { NTSTATUS status; struct spoolss_EnumPrinterData r; @@ -618,6 +618,38 @@ static BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +static BOOL test_EnumPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct spoolss_EnumPrinterDataEx r; + + r.in.handle = handle; + r.in.key_name = "PrinterDriverData"; + r.in.buf_size = 0; + + printf("Testing EnumPrinterDataEx\n"); + + status = dcerpc_spoolss_EnumPrinterDataEx(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPrinterDataEx failed - %s\n", nt_errstr(status)); + return False; + } + + r.in.buf_size = r.out.buf_size; + + status = dcerpc_spoolss_EnumPrinterDataEx(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("EnumPrinterDataEx failed - %s\n", nt_errstr(status)); + return False; + } + + return True; +} + + static BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, const char *value_name) @@ -907,6 +939,10 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_EnumPrinterDataEx(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_EnumJobs(p, mem_ctx, &handle)) { ret = False; } -- cgit From df643022136a4b229aca817f5b57f7302a97f852 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 19 Mar 2005 08:34:43 +0000 Subject: r5902: A rather large change... I wanted to add a simple 'workstation' argument to the DCERPC authenticated binding calls, but this patch kind of grew from there. With SCHANNEL, the 'workstation' name (the netbios name of the client) matters, as this is what ties the session between the NETLOGON ops and the SCHANNEL bind. This changes a lot of files, and these will again be changed when jelmer does the credentials work. I also correct some schannel IDL to distinguish between workstation names and account names. The distinction matters for domain trust accounts. Issues in handling this (issues with lifetime of talloc pointers) caused me to change the 'creds_CredentialsState' and 'struct dcerpc_binding' pointers to always be talloc()ed pointers. In the schannel DB, we now store both the domain and computername, and query on both. This should ensure we fault correctly when the domain is specified incorrectly in the SCHANNEL bind. In the RPC-SCHANNEL test, I finally fixed a bug that vl pointed out, where the comment claimed we re-used a connection, but in fact we made a new connection. This was achived by breaking apart some of the dcerpc_secondary_connection() logic. The addition of workstation handling was also propogated to NTLMSSP and GENSEC, for completeness. The RPC-SAMSYNC test has been cleaned up a little, using a loop over usernames/passwords rather than manually expanded tests. This will be expanded further (the code in #if 0 in this patch) to use a newly created user account for testing. In making this test pass test_rpc.sh, I found a bug in the RPC-ECHO server, caused by the removal of [ref] and the assoicated pointer from the IDL. This has been re-added, until the underlying pidl issues are solved. (This used to be commit 824289dcc20908ddec957a4a892a103eec2da9b9) --- source4/torture/rpc/spoolss.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 7a9d8c3635..e5c827afaa 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -705,6 +705,7 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct struct policy_handle *handle) { NTSTATUS status; + struct dcerpc_binding *b; struct dcerpc_pipe *p2; BOOL ret = True; @@ -715,15 +716,27 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct printf("testing close on secondary pipe\n"); - status = dcerpc_secondary_connection(p, &p2, - DCERPC_SPOOLSS_NAME, - DCERPC_SPOOLSS_UUID, - DCERPC_SPOOLSS_VERSION); + status = dcerpc_parse_binding(mem_ctx, p->conn->binding_string, &b); + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to parse dcerpc binding '%s'\n", p->conn->binding_string); + return False; + } + + status = dcerpc_secondary_connection(p, &p2, b); if (!NT_STATUS_IS_OK(status)) { printf("Failed to create secondary connection\n"); return False; } + status = dcerpc_bind_auth_none(p2, DCERPC_SPOOLSS_UUID, + DCERPC_SPOOLSS_VERSION); + if (!NT_STATUS_IS_OK(status)) { + printf("Failed to create bind on secondary connection\n"); + dcerpc_pipe_close(p2); + + return False; + } + if (test_ClosePrinter(p2, mem_ctx, handle)) { printf("ERROR: Allowed close on secondary connection!\n"); ret = False; -- cgit From 645711c602313940dcf80ec786557920ecfbf884 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 22 Mar 2005 08:00:45 +0000 Subject: r5941: Commit this patch much earlier than I would normally prefer, but metze needs a working tree... The main volume of this patch was what I started working on today: - Cleans up memory handling around DCE/RPC pipes, to have a parent talloc context. - Uses sepereate inner loops for some of the DCE/RPC tests The other and more important part of this patch fixes issues surrounding the new credentials framwork: This makes the struct cli_credentials always a talloc() structure, rather than on the stack. Parts of the cli_credentials code already assumed this. There were other issues, particularly in the DCERPC over SMB handling, as well as little things that had to be tidied up before test_w2k3.sh would start to pass. Andrew Bartlett (This used to be commit 0453f9d05d2e336fba1f85dbf2718d01fa2bf778) --- source4/torture/rpc/spoolss.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e5c827afaa..acaa5828dc 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -732,7 +732,7 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct DCERPC_SPOOLSS_VERSION); if (!NT_STATUS_IS_OK(status)) { printf("Failed to create bind on secondary connection\n"); - dcerpc_pipe_close(p2); + talloc_free(p2); return False; } @@ -748,7 +748,7 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct ret = False; } - dcerpc_pipe_close(p2); + talloc_free(p2); return ret; } @@ -1165,16 +1165,18 @@ BOOL torture_rpc_spoolss(void) TALLOC_CTX *mem_ctx; BOOL ret = True; - status = torture_rpc_connection(&p, + mem_ctx = talloc_init("torture_rpc_spoolss"); + + status = torture_rpc_connection(mem_ctx, + &p, DCERPC_SPOOLSS_NAME, DCERPC_SPOOLSS_UUID, DCERPC_SPOOLSS_VERSION); if (!NT_STATUS_IS_OK(status)) { + talloc_free(mem_ctx); return False; } - mem_ctx = talloc_init("torture_rpc_spoolss"); - ret &= test_OpenPrinter_badnames(p, mem_ctx); ret &= test_AddPort(p, mem_ctx); @@ -1187,7 +1189,5 @@ BOOL torture_rpc_spoolss(void) talloc_free(mem_ctx); - torture_rpc_close(p); - return ret; } -- cgit From 3abce73193dcc393fee5ca6e326678009e87cbd7 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 2 Apr 2005 06:51:54 +0000 Subject: r6179: - add new spoolss tests for all spoolss_Enum*() calls which didn't need a handle as parameter, EnumPorts EnumPrinterDrivers EnumMonitors EnumPrintProcessors EnumPrinters we now do cross checks between the different info levels and sore the results in a global context, so that we later can add cross checks between the different object types - add idl for EnumMonitors and EnumPrintProcessors metze (This used to be commit 92a3721bc7a28d521090b10eb3b1eed089036432) --- source4/torture/rpc/spoolss.c | 633 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 626 insertions(+), 7 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index acaa5828dc..c2be0b5324 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -3,6 +3,7 @@ test suite for spoolss rpc operations Copyright (C) Tim Potter 2003 + Copyright (C) Stefan Metzmacher 2005 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +23,610 @@ #include "includes.h" #include "librpc/gen_ndr/ndr_spoolss.h" +struct test_spoolss_context { + struct dcerpc_pipe *p; + + /* for EnumPorts */ + uint32_t port_count[3]; + union spoolss_PortInfo **ports[3]; + + /* for EnumPrinterDrivers */ + uint32_t driver_count[7]; + union spoolss_DriverInfo **drivers[7]; + + /* for EnumMonitors */ + uint32_t monitor_count[3]; + union spoolss_MonitorInfo **monitors[3]; + + /* for EnumPrintProcessors */ + uint32_t print_processor_count[2]; + union spoolss_PrintProcessorInfo **print_processors[2]; + + /* for EnumPrinters */ + uint32_t printer_count[6]; + union spoolss_PrinterInfo **printers[6]; +}; + +#define COMPARE_STRING(c,r,e) do {\ + BOOL _ok = True;\ + if (c.e && !r.e) _ok = False;\ + if (!c.e && r.e) _ok = False;\ + if (c.e && r.e && strcmp_safe(c.e, r.e) != 0) _ok = False;\ + if (!_ok){\ + printf("%s: " #c "." #e " [%s] doesn't match " #r "." #e " [%s]\n",\ + __location__, c.e, r.e);\ + ret = False;\ + }\ +} while(0) + +#define COMPARE_UINT16(c,r,e) do {\ + if (c.e != r.e){\ + printf("%s: " #c "." #e " 0x%08X (%u) doesn't match " #r "." #e " 0x%08X (%u)\n",\ + __location__, c.e, c.e, r.e, r.e);\ + ret = False;\ + }\ +} while(0) + +#define COMPARE_UINT32(c,r,e) do {\ + if (c.e != r.e){\ + printf("%s: " #c "." #e " 0x%04X (%u) doesn't match " #r "." #e " 0x%04X (%u)\n",\ + __location__, c.e, c.e, r.e, r.e);\ + ret = False;\ + }\ +} while(0) + +#define COMPARE_UINT64(c,r,e) do {\ + if (c.e != r.e){\ + printf("%s: " #c "." #e " 0x%08X%08X (%llu) doesn't match " #r "." #e " 0x%08X%08X (%llu)\n",\ + __location__, (uint32_t)(c.e >> 32), (uint32_t)(c.e & 0xFFFFFFFF), c.e,\ + (uint32_t)(r.e >> 32), (uint32_t)(r.e & 0xFFFFFFFF), r.e);\ + ret = False;\ + }\ +} while(0) + +/* TODO: ! */ +#define COMPARE_SEC_DESC(c,r,e) +#define COMPARE_SPOOLSS_TIME(c,r,e) +#define COMPARE_STRING_ARRAY(c,r,e) + +static BOOL test_EnumPorts(struct test_spoolss_context *ctx) +{ + NTSTATUS status; + struct spoolss_EnumPorts r; + uint16_t levels[] = { 1, 2 }; + int i, j; + BOOL ret = True; + + for (i=0;ip, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPorts failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + printf("EnumPorts unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + blob = data_blob_talloc(ctx, NULL, buf_size); + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_EnumPorts(ctx->p, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPorts failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumPorts failed - %s\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + ctx->port_count[level] = r.out.count; + ctx->ports[level] = r.out.info; + } + + for (i=1;iport_count[level] != ctx->port_count[old_level]) { + printf("EnumPorts level[%d] returns [%u] ports, but level[%d] returns [%u]\n", + level, ctx->port_count[level], old_level, ctx->port_count[old_level]); + ret = False; + } + } + /* if the array sizes are not the same we would maybe segfault in the following code */ + if (!ret) return ret; + + for (i=0;iport_count[level];j++) { + union spoolss_PortInfo *cur = &ctx->ports[level][0][j]; + union spoolss_PortInfo *ref = &ctx->ports[2][0][j]; + switch (level) { + case 1: + COMPARE_STRING(cur->info1, ref->info2, port_name); + break; + case 2: + /* level 2 is our reference, and it makes no sense to compare it to itself */ + break; + } + } + } + + return True; +} + +static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) +{ + NTSTATUS status; + struct spoolss_EnumPrinterDrivers r; + uint16_t levels[] = { 1, 2, 3, 4, 5, 6 }; + int i, j; + BOOL ret = True; + + for (i=0;ip, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPrinterDrivers failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + printf("EnumPrinterDrivers unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + blob = data_blob_talloc(ctx, NULL, buf_size); + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_EnumPrinterDrivers(ctx->p, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPrinterDrivers failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumPrinterDrivers failed - %s\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + ctx->driver_count[level] = r.out.count; + ctx->drivers[level] = r.out.info; + } + + for (i=1;idriver_count[level] != ctx->driver_count[old_level]) { + printf("EnumPrinterDrivers level[%d] returns [%u] drivers, but level[%d] returns [%u]\n", + level, ctx->driver_count[level], old_level, ctx->driver_count[old_level]); + ret = False; + } + } + /* if the array sizes are not the same we would maybe segfault in the following code */ + if (!ret) return ret; + + for (i=0;idriver_count[level];j++) { + union spoolss_DriverInfo *cur = &ctx->drivers[level][0][j]; + union spoolss_DriverInfo *ref = &ctx->drivers[6][0][j]; + switch (level) { + case 1: + COMPARE_STRING(cur->info1, ref->info6, driver_name); + break; + case 2: + COMPARE_UINT32(cur->info2, ref->info6, version); + COMPARE_STRING(cur->info2, ref->info6, driver_name); + COMPARE_STRING(cur->info2, ref->info6, architecture); + COMPARE_STRING(cur->info2, ref->info6, driver_path); + COMPARE_STRING(cur->info2, ref->info6, data_file); + COMPARE_STRING(cur->info2, ref->info6, config_file); + break; + case 3: + COMPARE_UINT32(cur->info3, ref->info6, version); + COMPARE_STRING(cur->info3, ref->info6, driver_name); + COMPARE_STRING(cur->info3, ref->info6, architecture); + COMPARE_STRING(cur->info3, ref->info6, driver_path); + COMPARE_STRING(cur->info3, ref->info6, data_file); + COMPARE_STRING(cur->info3, ref->info6, config_file); + COMPARE_STRING(cur->info3, ref->info6, help_file); + COMPARE_STRING_ARRAY(cur->info3, ref->info6, dependent_files); + COMPARE_STRING(cur->info3, ref->info6, monitor_name); + COMPARE_STRING(cur->info3, ref->info6, default_datatype); + break; + case 4: + COMPARE_UINT32(cur->info4, ref->info6, version); + COMPARE_STRING(cur->info4, ref->info6, driver_name); + COMPARE_STRING(cur->info4, ref->info6, architecture); + COMPARE_STRING(cur->info4, ref->info6, driver_path); + COMPARE_STRING(cur->info4, ref->info6, data_file); + COMPARE_STRING(cur->info4, ref->info6, config_file); + COMPARE_STRING(cur->info4, ref->info6, help_file); + COMPARE_STRING_ARRAY(cur->info4, ref->info6, dependent_files); + COMPARE_STRING(cur->info4, ref->info6, monitor_name); + COMPARE_STRING(cur->info4, ref->info6, default_datatype); + COMPARE_STRING_ARRAY(cur->info4, ref->info6, previous_names); + break; + case 5: + COMPARE_UINT32(cur->info5, ref->info6, version); + COMPARE_STRING(cur->info5, ref->info6, driver_name); + COMPARE_STRING(cur->info5, ref->info6, architecture); + COMPARE_STRING(cur->info5, ref->info6, driver_path); + COMPARE_STRING(cur->info5, ref->info6, data_file); + COMPARE_STRING(cur->info5, ref->info6, config_file); + /*COMPARE_UINT32(cur->info5, ref->info6, driver_attributes);*/ + /*COMPARE_UINT32(cur->info5, ref->info6, config_version);*/ + /*TODO: ! COMPARE_UINT32(cur->info5, ref->info6, driver_version); */ + break; + case 6: + /* level 6 is our reference, and it makes no sense to compare it to itself */ + break; + } + } + } + + return ret; +} + +static BOOL test_EnumMonitors(struct test_spoolss_context *ctx) +{ + NTSTATUS status; + struct spoolss_EnumMonitors r; + uint16_t levels[] = { 1, 2 }; + int i, j; + BOOL ret = True; + + for (i=0;ip, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumMonitors failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + printf("EnumMonitors unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + blob = data_blob_talloc(ctx, NULL, buf_size); + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_EnumMonitors(ctx->p, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumMonitors failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumMonitors failed - %s\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + ctx->monitor_count[level] = r.out.count; + ctx->monitors[level] = r.out.info; + } + + for (i=1;imonitor_count[level] != ctx->monitor_count[old_level]) { + printf("EnumMonitors level[%d] returns [%u] monitors, but level[%d] returns [%u]\n", + level, ctx->monitor_count[level], old_level, ctx->monitor_count[old_level]); + ret = False; + } + } + /* if the array sizes are not the same we would maybe segfault in the following code */ + if (!ret) return ret; + + for (i=0;imonitor_count[level];j++) { + union spoolss_MonitorInfo *cur = &ctx->monitors[level][0][j]; + union spoolss_MonitorInfo *ref = &ctx->monitors[2][0][j]; + switch (level) { + case 1: + COMPARE_STRING(cur->info1, ref->info2, monitor_name); + break; + case 2: + /* level 2 is our reference, and it makes no sense to compare it to itself */ + break; + } + } + } + + return ret; +} + +static BOOL test_EnumPrintProcessors(struct test_spoolss_context *ctx) +{ + NTSTATUS status; + struct spoolss_EnumPrintProcessors r; + uint16_t levels[] = { 1 }; + int i, j; + BOOL ret = True; + + for (i=0;ip, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPrintProcessors failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + printf("EnumPrintProcessors unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + blob = data_blob_talloc(ctx, NULL, buf_size); + data_blob_clear(&blob); + r.in.buffer = &blob; + + status = dcerpc_spoolss_EnumPrintProcessors(ctx->p, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPrintProcessors failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumPrintProcessors failed - %s\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + ctx->print_processor_count[level] = r.out.count; + ctx->print_processors[level] = r.out.info; + } + + for (i=1;iprint_processor_count[level] != ctx->print_processor_count[old_level]) { + printf("EnumPrintProcessors level[%d] returns [%u] print_processors, but level[%d] returns [%u]\n", + level, ctx->print_processor_count[level], old_level, ctx->print_processor_count[old_level]); + ret = False; + } + } + /* if the array sizes are not the same we would maybe segfault in the following code */ + if (!ret) return ret; + + for (i=0;iprint_processor_count[level];j++) { +#if 0 + union spoolss_PrintProcessorInfo *cur = &ctx->print_processors[level][0][j]; + union spoolss_PrintProcessorInfo *ref = &ctx->print_processors[1][0][j]; +#endif + switch (level) { + case 1: + /* level 1 is our reference, and it makes no sense to compare it to itself */ + break; + } + } + } + + return ret; +} + +static BOOL test_EnumPrinters(struct test_spoolss_context *ctx) +{ + struct spoolss_EnumPrinters r; + NTSTATUS status; + uint16_t levels[] = { 0, 1, 2, 4, 5 }; + int i, j; + BOOL ret = True; + + for (i=0;ip, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPrinters failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + printf("EnumPrinters unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + blob = data_blob_talloc(ctx, NULL, buf_size); + data_blob_clear(&blob); + r.in.buffer = &blob; + status = dcerpc_spoolss_EnumPrinters(ctx->p, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EnumPrinters failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumPrinters failed - %s\n", + win_errstr(r.out.result)); + continue; + } + + ctx->printer_count[level] = r.out.count; + ctx->printers[level] = r.out.info; + } + + for (i=1;iprinter_count[level] != ctx->printer_count[old_level]) { + printf("EnumPrinters level[%d] returns [%u] printers, but level[%d] returns [%u]\n", + level, ctx->printer_count[level], old_level, ctx->printer_count[old_level]); + ret = False; + } + } + /* if the array sizes are not the same we would maybe segfault in the following code */ + if (!ret) return ret; + + for (i=0;iprinter_count[level];j++) { + union spoolss_PrinterInfo *cur = &ctx->printers[level][0][j]; + union spoolss_PrinterInfo *ref = &ctx->printers[2][0][j]; + switch (level) { + case 0: + COMPARE_STRING(cur->info0, ref->info2, printername); + COMPARE_STRING(cur->info0, ref->info2, servername); + COMPARE_UINT32(cur->info0, ref->info2, cjobs); + /*COMPARE_UINT32(cur->info0, ref->info2, total_jobs); + COMPARE_UINT32(cur->info0, ref->info2, total_bytes); + COMPARE_SPOOLSS_TIME(cur->info0, ref->info2, spoolss_Time time); + COMPARE_UINT32(cur->info0, ref->info2, global_counter); + COMPARE_UINT32(cur->info0, ref->info2, total_pages); + COMPARE_UINT32(cur->info0, ref->info2, version); + COMPARE_UINT32(cur->info0, ref->info2, unknown10); + COMPARE_UINT32(cur->info0, ref->info2, unknown11); + COMPARE_UINT32(cur->info0, ref->info2, unknown12); + COMPARE_UINT32(cur->info0, ref->info2, session_counter); + COMPARE_UINT32(cur->info0, ref->info2, unknown14); + COMPARE_UINT32(cur->info0, ref->info2, printer_errors); + COMPARE_UINT32(cur->info0, ref->info2, unknown16); + COMPARE_UINT32(cur->info0, ref->info2, unknown17); + COMPARE_UINT32(cur->info0, ref->info2, unknown18); + COMPARE_UINT32(cur->info0, ref->info2, unknown19); + COMPARE_UINT32(cur->info0, ref->info2, change_id); + COMPARE_UINT32(cur->info0, ref->info2, unknown21);*/ + COMPARE_UINT32(cur->info0, ref->info2, status); + /*COMPARE_UINT32(cur->info0, ref->info2, unknown23); + COMPARE_UINT32(cur->info0, ref->info2, c_setprinter); + COMPARE_UINT16(cur->info0, ref->info2, unknown25); + COMPARE_UINT16(cur->info0, ref->info2, unknown26); + COMPARE_UINT32(cur->info0, ref->info2, unknown27); + COMPARE_UINT32(cur->info0, ref->info2, unknown28); + COMPARE_UINT32(cur->info0, ref->info2, unknown29);*/ + break; + case 1: + /*COMPARE_UINT32(cur->info1, ref->info2, flags);*/ + /*COMPARE_STRING(cur->info1, ref->info2, name);*/ + /*COMPARE_STRING(cur->info1, ref->info2, description);*/ + COMPARE_STRING(cur->info1, ref->info2, comment); + break; + case 2: + /* level 2 is our reference, and it makes no sense to compare it to itself */ + break; + case 4: + COMPARE_STRING(cur->info4, ref->info2, printername); + COMPARE_STRING(cur->info4, ref->info2, servername); + COMPARE_UINT32(cur->info4, ref->info2, attributes); + break; + case 5: + COMPARE_STRING(cur->info5, ref->info2, printername); + COMPARE_STRING(cur->info5, ref->info2, portname); + COMPARE_UINT32(cur->info5, ref->info2, attributes); + /*COMPARE_UINT32(cur->info5, ref->info2, device_not_selected_timeout); + COMPARE_UINT32(cur->info5, ref->info2, transmission_retry_timeout);*/ + break; + } + } + } + + /* TODO: + * - verify that the port of a printer was in the list returned by EnumPorts + */ + + return ret; +} + static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { @@ -284,7 +889,7 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return ret; } -static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +static BOOL test_EnumPorts_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { NTSTATUS status; struct spoolss_EnumPorts r; @@ -975,7 +1580,7 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return ret; } -static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +static BOOL test_EnumPrinters_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinters r; NTSTATUS status; @@ -1095,8 +1700,8 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } #endif - -static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) + +static BOOL test_EnumPrinterDrivers_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { struct spoolss_EnumPrinterDrivers r; NTSTATUS status; @@ -1164,6 +1769,7 @@ BOOL torture_rpc_spoolss(void) struct dcerpc_pipe *p; TALLOC_CTX *mem_ctx; BOOL ret = True; + struct test_spoolss_context *ctx; mem_ctx = talloc_init("torture_rpc_spoolss"); @@ -1177,15 +1783,28 @@ BOOL torture_rpc_spoolss(void) return False; } + ctx = talloc_zero(mem_ctx, struct test_spoolss_context); + ctx->p = p; + + ret &= test_EnumPorts(ctx); + + ret &= test_EnumPrinterDrivers(ctx); + + ret &= test_EnumMonitors(ctx); + + ret &= test_EnumPrintProcessors(ctx); + + ret &= test_EnumPrinters(ctx); + ret &= test_OpenPrinter_badnames(p, mem_ctx); ret &= test_AddPort(p, mem_ctx); - ret &= test_EnumPorts(p, mem_ctx); + ret &= test_EnumPorts_old(p, mem_ctx); - ret &= test_EnumPrinters(p, mem_ctx); + ret &= test_EnumPrinters_old(p, mem_ctx); - ret &= test_EnumPrinterDrivers(p, mem_ctx); + ret &= test_EnumPrinterDrivers_old(p, mem_ctx); talloc_free(mem_ctx); -- cgit From 746bb14367f87204baebfcda7f3170e3d9dd6b8f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 4 Apr 2005 15:19:27 +0000 Subject: r6194: - fix some spoolss_*Form names and types - fix GetPrinterData(), look inside the datablob - add idl for RemoteFindFirstChangeNotify(), without meaning yet, just to not return a DCERPC_FAULT when receiving this request metze (This used to be commit 92f3d5bd9c700032612ac20dc7635730c555c4da) --- source4/torture/rpc/spoolss.c | 94 +++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 25 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c2be0b5324..e75567d55d 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -26,6 +26,9 @@ struct test_spoolss_context { struct dcerpc_pipe *p; + /* print server handle */ + struct policy_handle server_handle; + /* for EnumPorts */ uint32_t port_count[3]; union spoolss_PortInfo **ports[3]; @@ -89,6 +92,35 @@ struct test_spoolss_context { #define COMPARE_SPOOLSS_TIME(c,r,e) #define COMPARE_STRING_ARRAY(c,r,e) +static BOOL test_OpenPrinter_server(struct test_spoolss_context *ctx) +{ + NTSTATUS status; + struct spoolss_OpenPrinter op; + BOOL ret = True; + + op.in.printername = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p)); + op.in.datatype = NULL; + op.in.devmode_ctr.size = 0; + op.in.devmode_ctr.devmode= NULL; + op.in.access_mask = 0; + op.out.handle = &ctx->server_handle; + + printf("\nTesting OpenPrinter(%s)\n", op.in.printername); + + status = dcerpc_spoolss_OpenPrinter(ctx->p, ctx, &op); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_OpenPrinter failed - %s\n", nt_errstr(status)); + ret = False; + } + if (!W_ERROR_IS_OK(op.out.result)) { + printf("OpenPrinter(%s) failed - %s\n", + op.in.printername, win_errstr(op.out.result)); + ret = False; + } + + return ret; +} + static BOOL test_EnumPorts(struct test_spoolss_context *ctx) { NTSTATUS status; @@ -700,14 +732,14 @@ static BOOL test_ClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, static BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, - const char *formname) + const char *form_name) { NTSTATUS status; struct spoolss_GetForm r; uint32_t buf_size; r.in.handle = handle; - r.in.formname = formname; + r.in.form_name = form_name; r.in.level = 1; r.in.buffer = NULL; buf_size = 0; @@ -780,7 +812,7 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, info = *r.out.info; for (j = 0; j < r.out.count; j++) { - test_GetForm(p, mem_ctx, handle, info[j].info1.formname); + test_GetForm(p, mem_ctx, handle, info[j].info1.form_name); } } @@ -799,13 +831,13 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, static BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, - const char *formname) + const char *form_name) { NTSTATUS status; struct spoolss_DeleteForm r; r.in.handle = handle; - r.in.formname = formname; + r.in.form_name = form_name; status = dcerpc_spoolss_DeleteForm(p, mem_ctx, &r); @@ -826,23 +858,23 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { struct spoolss_AddForm r; - struct spoolss_AddFormInfo1 form; + struct spoolss_AddFormInfo1 addform; + const char *form_name = "testform3"; NTSTATUS status; - const char *formname = "testform3"; BOOL ret = True; - r.in.handle = handle; - r.in.level = 1; - form.flags = 2; /* User form */ - form.formname = formname; - form.width = 1; - form.length = 2; - form.left = 3; - form.top = 4; - form.right = 5; - form.bottom = 6; - r.in.info.info1 = &form; - + r.in.handle = handle; + r.in.level = 1; + r.in.info.info1 = &addform; + addform.flags = SPOOLSS_FORM_USER; + addform.form_name = form_name; + addform.size.width = 50; + addform.size.height = 25; + addform.area.left = 5; + addform.area.top = 10; + addform.area.right = 45; + addform.area.bottom = 15; + status = dcerpc_spoolss_AddForm(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { @@ -857,12 +889,18 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, { struct spoolss_SetForm sf; + struct spoolss_SetFormInfo1 setform; + + sf.in.handle = handle; + sf.in.form_name = form_name; + sf.in.level = 1; + sf.in.info.info1= &setform; + setform.flags = addform.flags; + setform.form_name = addform.form_name; + setform.size = addform.size; + setform.area = addform.area; - sf.in.handle = handle; - sf.in.formname = formname; - sf.in.level = 1; - sf.in.info.info1 = &form; - form.width = 1234; + setform.size.width = 1234; status = dcerpc_spoolss_SetForm(p, mem_ctx, &sf); @@ -881,7 +919,7 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } done: - if (!test_DeleteForm(p, mem_ctx, handle, formname)) { + if (!test_DeleteForm(p, mem_ctx, handle, form_name)) { printf("DeleteForm failed\n"); ret = False; } @@ -1786,6 +1824,12 @@ BOOL torture_rpc_spoolss(void) ctx = talloc_zero(mem_ctx, struct test_spoolss_context); ctx->p = p; + ret &= test_OpenPrinter_server(ctx); + + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, SPOOLSS_ARCHITECTURE); + + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory"); + ret &= test_EnumPorts(ctx); ret &= test_EnumPrinterDrivers(ctx); -- cgit From d3911fa5d7fbc00c185eb95ff06b9c83b4e5afdc Mon Sep 17 00:00:00 2001 From: Richard Sharpe Date: Mon, 4 Apr 2005 16:40:23 +0000 Subject: r6195: I think Metze meant SPOOLSS_ARCHITECTURE_NT_X86, but I could be wrong. (This used to be commit 85c2b8b9447efdcefe16517a5509357262c6229c) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e75567d55d..cc22db42bd 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1826,7 +1826,7 @@ BOOL torture_rpc_spoolss(void) ret &= test_OpenPrinter_server(ctx); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, SPOOLSS_ARCHITECTURE); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, SPOOLSS_ARCHITECTURE_NT_X86); ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory"); -- cgit From 4baf0b01c40bd2b8cfd19d34ee573e6c01614100 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 4 Apr 2005 17:04:03 +0000 Subject: r6197: fix for my last commit, I removed SPOOLSS_ARCHITECTURE, which was "Architecture" (sorry richard:-) disable lookup for DefaultSpoolDirectory until, I have fixed the parsing when WERR_MORE_DATA is returned metze (This used to be commit d5993337b814560cd59d8d08b30fe31e2fb9fd28) --- source4/torture/rpc/spoolss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index cc22db42bd..4cd3b7a5b3 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1826,9 +1826,9 @@ BOOL torture_rpc_spoolss(void) ret &= test_OpenPrinter_server(ctx); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, SPOOLSS_ARCHITECTURE_NT_X86); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory"); + /*ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory");*/ ret &= test_EnumPorts(ctx); -- cgit From 62480f12529326d174d2c53376765e88ca03754f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 30 May 2005 22:44:17 +0000 Subject: r7120: make use of the new 'noopnum' property and get rid of handwritten parsing code for the spoolss_Enum* functions, there still same handwritten code needed but just to stack the autogenerated code into the correct way metze (This used to be commit 155d18e8b78afebfb4a84e43e3b4d8fc6c9cc4e2) --- source4/torture/rpc/spoolss.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 4cd3b7a5b3..b9d48a6da4 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -31,23 +31,23 @@ struct test_spoolss_context { /* for EnumPorts */ uint32_t port_count[3]; - union spoolss_PortInfo **ports[3]; + union spoolss_PortInfo *ports[3]; /* for EnumPrinterDrivers */ uint32_t driver_count[7]; - union spoolss_DriverInfo **drivers[7]; + union spoolss_DriverInfo *drivers[7]; /* for EnumMonitors */ uint32_t monitor_count[3]; - union spoolss_MonitorInfo **monitors[3]; + union spoolss_MonitorInfo *monitors[3]; /* for EnumPrintProcessors */ uint32_t print_processor_count[2]; - union spoolss_PrintProcessorInfo **print_processors[2]; + union spoolss_PrintProcessorInfo *print_processors[2]; /* for EnumPrinters */ uint32_t printer_count[6]; - union spoolss_PrinterInfo **printers[6]; + union spoolss_PrinterInfo *printers[6]; }; #define COMPARE_STRING(c,r,e) do {\ @@ -194,8 +194,8 @@ static BOOL test_EnumPorts(struct test_spoolss_context *ctx) for (i=0;iport_count[level];j++) { - union spoolss_PortInfo *cur = &ctx->ports[level][0][j]; - union spoolss_PortInfo *ref = &ctx->ports[2][0][j]; + union spoolss_PortInfo *cur = &ctx->ports[level][j]; + union spoolss_PortInfo *ref = &ctx->ports[2][j]; switch (level) { case 1: COMPARE_STRING(cur->info1, ref->info2, port_name); @@ -284,8 +284,8 @@ static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) for (i=0;idriver_count[level];j++) { - union spoolss_DriverInfo *cur = &ctx->drivers[level][0][j]; - union spoolss_DriverInfo *ref = &ctx->drivers[6][0][j]; + union spoolss_DriverInfo *cur = &ctx->drivers[level][j]; + union spoolss_DriverInfo *ref = &ctx->drivers[6][j]; switch (level) { case 1: COMPARE_STRING(cur->info1, ref->info6, driver_name); @@ -417,8 +417,8 @@ static BOOL test_EnumMonitors(struct test_spoolss_context *ctx) for (i=0;imonitor_count[level];j++) { - union spoolss_MonitorInfo *cur = &ctx->monitors[level][0][j]; - union spoolss_MonitorInfo *ref = &ctx->monitors[2][0][j]; + union spoolss_MonitorInfo *cur = &ctx->monitors[level][j]; + union spoolss_MonitorInfo *ref = &ctx->monitors[2][j]; switch (level) { case 1: COMPARE_STRING(cur->info1, ref->info2, monitor_name); @@ -508,8 +508,8 @@ static BOOL test_EnumPrintProcessors(struct test_spoolss_context *ctx) int level = levels[i]; for (j=0;jprint_processor_count[level];j++) { #if 0 - union spoolss_PrintProcessorInfo *cur = &ctx->print_processors[level][0][j]; - union spoolss_PrintProcessorInfo *ref = &ctx->print_processors[1][0][j]; + union spoolss_PrintProcessorInfo *cur = &ctx->print_processors[level][j]; + union spoolss_PrintProcessorInfo *ref = &ctx->print_processors[1][j]; #endif switch (level) { case 1: @@ -593,8 +593,8 @@ static BOOL test_EnumPrinters(struct test_spoolss_context *ctx) for (i=0;iprinter_count[level];j++) { - union spoolss_PrinterInfo *cur = &ctx->printers[level][0][j]; - union spoolss_PrinterInfo *ref = &ctx->printers[2][0][j]; + union spoolss_PrinterInfo *cur = &ctx->printers[level][j]; + union spoolss_PrinterInfo *ref = &ctx->printers[2][j]; switch (level) { case 0: COMPARE_STRING(cur->info0, ref->info2, printername); @@ -809,7 +809,7 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } - info = *r.out.info; + info = r.out.info; for (j = 0; j < r.out.count; j++) { test_GetForm(p, mem_ctx, handle, info[j].info1.form_name); @@ -1108,7 +1108,7 @@ static BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } - info = *r.out.info; + info = r.out.info; for (j = 0; j < r.out.count; j++) { test_GetJob(p, mem_ctx, handle, info[j].info1.job_id); @@ -1671,7 +1671,7 @@ static BOOL test_EnumPrinters_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) continue; } - info = *r.out.info; + info = r.out.info; for (j=0;j Date: Mon, 6 Jun 2005 09:59:43 +0000 Subject: r7328: fix GetPrinterData and SetPrinterData, with zero length subcontexts metze (This used to be commit 73d597bacf83492ed3da2307dd6785548b903b39) --- source4/torture/rpc/spoolss.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index b9d48a6da4..7f56212b74 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1324,9 +1324,8 @@ static BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.handle = handle; r.in.value_name = value_name; - r.in.type = 0; - r.in.buffer = data_blob_talloc(mem_ctx, "dog", 4); - r.in.real_len = 4; + r.in.type = SPOOLSS_PRINTER_DATA_TYPE_STRING; + r.in.data.string = "dog"; printf("Testing SetPrinterData\n"); @@ -1337,6 +1336,10 @@ static BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } + if (!test_GetPrinterData(p, mem_ctx, handle, value_name)) { + return False; + } + if (!test_DeletePrinterData(p, mem_ctx, handle, value_name)) { return False; } @@ -1828,7 +1831,7 @@ BOOL torture_rpc_spoolss(void) ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture"); - /*ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory");*/ + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory"); ret &= test_EnumPorts(ctx); -- cgit From d8889b6f8d2ce0c5551a0be0dbb24ae5a3abf53f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 6 Jun 2005 10:30:45 +0000 Subject: r7329: test some more PrinterData values metze (This used to be commit ad35bfb2250c97571334ab0e9b32b3080cba2e7f) --- source4/torture/rpc/spoolss.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 7f56212b74..19c7e3bd82 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1829,9 +1829,16 @@ BOOL torture_rpc_spoolss(void) ret &= test_OpenPrinter_server(ctx); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture"); - + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "W3SvcInstalled"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "BeepEnabled"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "EventLog"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "NetPopup"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "NetPopupToComputer"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "MajorVersion"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "MinorVersion"); ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DsPresent"); ret &= test_EnumPorts(ctx); -- cgit From 87bbda10bf8b66842ed9249691477baf63660766 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 6 Jun 2005 13:21:49 +0000 Subject: r7333: Pause and resume each printer metze (This used to be commit 191375f41708503e62e14132f691a9b6ec149a1b) --- source4/torture/rpc/spoolss.c | 72 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 19c7e3bd82..a1580b478d 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1123,6 +1123,70 @@ static BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +static BOOL test_PausePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct spoolss_SetPrinter r; + + r.in.handle = handle; + r.in.level = 0; + r.in.info.info1 = NULL; + r.in.devmode_ctr.size = 0; + r.in.devmode_ctr.devmode= NULL; + r.in.secdesc_ctr.size = 0; + r.in.secdesc_ctr.sd = NULL; + r.in.command = SPOOLSS_PRINTER_CONTROL_PAUSE; + + printf("Testing SetPrinter: SPOOLSS_PRINTER_CONTROL_PAUSE\n"); + + status = dcerpc_spoolss_SetPrinter(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("SetPrinter failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("SetPrinter failed - %s\n", win_errstr(r.out.result)); + return False; + } + + return True; +} + +static BOOL test_ResumePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct spoolss_SetPrinter r; + + r.in.handle = handle; + r.in.level = 0; + r.in.info.info1 = NULL; + r.in.devmode_ctr.size = 0; + r.in.devmode_ctr.devmode= NULL; + r.in.secdesc_ctr.size = 0; + r.in.secdesc_ctr.sd = NULL; + r.in.command = SPOOLSS_PRINTER_CONTROL_RESUME; + + printf("Testing SetPrinter: SPOOLSS_PRINTER_CONTROL_RESUME\n"); + + status = dcerpc_spoolss_SetPrinter(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("SetPrinter failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("SetPrinter failed - %s\n", win_errstr(r.out.result)); + return False; + } + + return True; +} + static BOOL test_GetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, const char *value_name) @@ -1602,10 +1666,18 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } + if (!test_PausePrinter(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_EnumJobs(p, mem_ctx, &handle)) { ret = False; } + if (!test_ResumePrinter(p, mem_ctx, &handle)) { + ret = False; + } + if (!test_SetPrinterData(p, mem_ctx, &handle)) { ret = False; } -- cgit From 6484698ee4ad961e2485816fb6d7fb2aa18fbffd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 6 Jun 2005 14:56:51 +0000 Subject: r7340: fix the build and some more error checks metze (This used to be commit da6263d4211d85872a232349164e669c33234d6f) --- source4/torture/rpc/spoolss.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index a1580b478d..c3df059056 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1046,15 +1046,15 @@ static BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_SetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle, uint32_t job_id, uint32_t command) + struct policy_handle *handle, uint32_t job_id, enum spoolss_JobControl command) { NTSTATUS status; struct spoolss_SetJob r; - r.in.handle = handle; - r.in.job_id = job_id; - r.in.level = 0; - r.in.command = command; + r.in.handle = handle; + r.in.job_id = job_id; + r.in.ctr = NULL; + r.in.command = command; printf("Testing SetJob\n"); @@ -1064,6 +1064,10 @@ static BOOL test_SetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("SetJob failed - %s\n", nt_errstr(status)); return False; } + if (!W_ERROR_IS_OK(r.out.result)) { + printf("SetJob failed - %s\n", win_errstr(r.out.result)); + return False; + } return True; } -- cgit From f9716b51cd6503911a18fd50698dd891387d1f8e Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 6 Jun 2005 15:03:16 +0000 Subject: r7342: submit a test job for each printer and delete this job metze (This used to be commit b71d57709733b33e553022271de4ec51f9049a66) --- source4/torture/rpc/spoolss.c | 58 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c3df059056..20b55f80bf 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1059,7 +1059,6 @@ static BOOL test_SetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("Testing SetJob\n"); status = dcerpc_spoolss_SetJob(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status)) { printf("SetJob failed - %s\n", nt_errstr(status)); return False; @@ -1116,7 +1115,8 @@ static BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, for (j = 0; j < r.out.count; j++) { test_GetJob(p, mem_ctx, handle, info[j].info1.job_id); - test_SetJob(p, mem_ctx, handle, info[j].info1.job_id, 1); + test_SetJob(p, mem_ctx, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_PAUSE); + test_SetJob(p, mem_ctx, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_RESUME); } } else if (!W_ERROR_IS_OK(r.out.result)) { @@ -1127,6 +1127,58 @@ static BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +static BOOL test_DoPrintTest(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + BOOL ret = True; + NTSTATUS status; + struct spoolss_StartDocPrinter s; + struct spoolss_DocumentInfo1 info1; + struct spoolss_EndDocPrinter e; + uint32_t job_id; + + printf("Testing StartDocPrinter\n"); + + s.in.handle = handle; + s.in.level = 1; + s.in.info.info1 = &info1; + info1.document_name = "TorturePrintJob"; + info1.output_file = NULL; + info1.datatype = "RAW"; + + status = dcerpc_spoolss_StartDocPrinter(p, mem_ctx, &s); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_StartDocPrinter failed - %s\n", nt_errstr(status)); + return False; + } + if (!W_ERROR_IS_OK(s.out.result)) { + printf("StartDocPrinter failed - %s\n", win_errstr(s.out.result)); + return False; + } + + job_id = s.out.job_id; + + printf("Testing EndDocPrinter\n"); + + e.in.handle = handle; + + status = dcerpc_spoolss_EndDocPrinter(p, mem_ctx, &e); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EndDocPrinter failed - %s\n", nt_errstr(status)); + return False; + } + if (!W_ERROR_IS_OK(e.out.result)) { + printf("EndDocPrinter failed - %s\n", win_errstr(e.out.result)); + return False; + } + + ret &= test_EnumJobs(p, mem_ctx, handle); + + ret &= test_SetJob(p, mem_ctx, handle, job_id, SPOOLSS_JOB_CONTROL_DELETE); + + return ret; +} + static BOOL test_PausePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle) { @@ -1674,7 +1726,7 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } - if (!test_EnumJobs(p, mem_ctx, &handle)) { + if (!test_DoPrintTest(p, mem_ctx, &handle)) { ret = False; } -- cgit From 22ae7886667242e78281bab5a1b1fa140149b035 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 6 Jun 2005 16:08:29 +0000 Subject: r7346: use StartPagePrinter(), WritePrinter() and EndPagePrinter() to print a few test pages on each printer (we don't actually print because we have paused the printer before...) metze (This used to be commit 6bccf55ab9dcdd8590684ab46c5b101e2969e7f7) --- source4/torture/rpc/spoolss.c | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 20b55f80bf..0ea74c7e56 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1134,7 +1134,11 @@ static BOOL test_DoPrintTest(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, NTSTATUS status; struct spoolss_StartDocPrinter s; struct spoolss_DocumentInfo1 info1; + struct spoolss_StartPagePrinter sp; + struct spoolss_WritePrinter w; + struct spoolss_EndPagePrinter ep; struct spoolss_EndDocPrinter e; + int i; uint32_t job_id; printf("Testing StartDocPrinter\n"); @@ -1158,6 +1162,51 @@ static BOOL test_DoPrintTest(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, job_id = s.out.job_id; + for (i=1; i < 4; i++) { + printf("Testing StartPagePrinter: Page[%d]\n", i); + + sp.in.handle = handle; + + status = dcerpc_spoolss_StartPagePrinter(p, mem_ctx, &sp); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_StartPagePrinter failed - %s\n", nt_errstr(status)); + return False; + } + if (!W_ERROR_IS_OK(sp.out.result)) { + printf("StartPagePrinter failed - %s\n", win_errstr(sp.out.result)); + return False; + } + + printf("Testing WritePrinter: Page[%d]\n", i); + + w.in.handle = handle; + w.in.data = data_blob_string_const(talloc_asprintf(mem_ctx,"TortureTestPage: %d\nData\n",i)); + + status = dcerpc_spoolss_WritePrinter(p, mem_ctx, &w); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_WritePrinter failed - %s\n", nt_errstr(status)); + return False; + } + if (!W_ERROR_IS_OK(w.out.result)) { + printf("WritePrinter failed - %s\n", win_errstr(w.out.result)); + return False; + } + + printf("Testing EndPagePrinter: Page[%d]\n", i); + + ep.in.handle = handle; + + status = dcerpc_spoolss_EndPagePrinter(p, mem_ctx, &ep); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_EndPagePrinter failed - %s\n", nt_errstr(status)); + return False; + } + if (!W_ERROR_IS_OK(ep.out.result)) { + printf("EndPagePrinter failed - %s\n", win_errstr(ep.out.result)); + return False; + } + } + printf("Testing EndDocPrinter\n"); e.in.handle = handle; -- cgit From 30da4d8d93cbfc0062a6c97c2b8255670615405c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 7 Jun 2005 14:31:45 +0000 Subject: r7369: allow no entries returned by Enum*() metze (This used to be commit 3778da9d17778cb215ac08e1dcd6ad8c0fa13dfd) --- source4/torture/rpc/spoolss.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 0ea74c7e56..5d9390ab59 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -149,7 +149,10 @@ static BOOL test_EnumPorts(struct test_spoolss_context *ctx) ret = False; continue; } - + if (W_ERROR_IS_OK(r.out.result)) { + /* TODO: do some more checks here */ + continue; + } if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { printf("EnumPorts unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", win_errstr(r.out.result)); @@ -239,7 +242,10 @@ static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) ret = False; continue; } - + if (W_ERROR_IS_OK(r.out.result)) { + /* TODO: do some more checks here */ + continue; + } if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { printf("EnumPrinterDrivers unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", win_errstr(r.out.result)); @@ -372,7 +378,10 @@ static BOOL test_EnumMonitors(struct test_spoolss_context *ctx) ret = False; continue; } - + if (W_ERROR_IS_OK(r.out.result)) { + /* TODO: do some more checks here */ + continue; + } if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { printf("EnumMonitors unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", win_errstr(r.out.result)); @@ -462,7 +471,10 @@ static BOOL test_EnumPrintProcessors(struct test_spoolss_context *ctx) ret = False; continue; } - + if (W_ERROR_IS_OK(r.out.result)) { + /* TODO: do some more checks here */ + continue; + } if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { printf("EnumPrintProcessors unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", win_errstr(r.out.result)); @@ -550,7 +562,10 @@ static BOOL test_EnumPrinters(struct test_spoolss_context *ctx) ret = False; continue; } - + if (W_ERROR_IS_OK(r.out.result)) { + /* TODO: do some more checks here */ + continue; + } if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { printf("EnumPrinters unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", win_errstr(r.out.result)); -- cgit From 56af29caa50558d280a68e4d65503ebe96e36473 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 10 Jun 2005 15:37:07 +0000 Subject: r7464: add newline to printf metze (This used to be commit 7123cd1116a464057bfaa0b3fcb881ee96f684cc) --- source4/torture/rpc/spoolss.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 5d9390ab59..61fda796fe 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -778,7 +778,7 @@ static BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_GetForm(p, mem_ctx, &r); if (!r.out.info) { - printf("No form info returned"); + printf("No form info returned\n"); return False; } } @@ -820,7 +820,7 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_EnumForms(p, mem_ctx, &r); if (!r.out.info) { - printf("No forms returned"); + printf("No forms returned\n"); return False; } @@ -979,7 +979,7 @@ static BOOL test_EnumPorts_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } if (!r.out.info) { - printf("No ports returned"); + printf("No ports returned\n"); return False; } } @@ -1052,7 +1052,7 @@ static BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_GetJob(p, mem_ctx, &r); if (!r.out.info) { - printf("No job info returned"); + printf("No job info returned\n"); return False; } } @@ -1122,7 +1122,7 @@ static BOOL test_EnumJobs(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_spoolss_EnumJobs(p, mem_ctx, &r); if (!r.out.info) { - printf("No jobs returned"); + printf("No jobs returned\n"); return True; } @@ -1862,7 +1862,7 @@ static BOOL test_EnumPrinters_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } if (!r.out.info) { - printf("No printers returned"); + printf("No printers returned\n"); continue; } @@ -1988,7 +1988,7 @@ static BOOL test_EnumPrinterDrivers_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_c } if (!r.out.info) { - printf("No printer drivers returned"); + printf("No printer drivers returned\n"); break; } } -- cgit From 04c3bbe05336f4ad0f2d73964676c9cda95f7027 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 14 Jun 2005 15:52:31 +0000 Subject: r7574: - seperate [in] and [out] buffers and buf_sizes - use the same names as etherel (offered,needed) for the buffer sizes (and they are really independently used) metze (This used to be commit f5532a5b74e972f44ed8aa19ee9c5851a4b40f65) --- source4/torture/rpc/spoolss.c | 140 +++++++++++++++--------------------------- 1 file changed, 50 insertions(+), 90 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 61fda796fe..7ae9291cf0 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -132,14 +132,11 @@ static BOOL test_EnumPorts(struct test_spoolss_context *ctx) for (i=0;ip, ctx, &r); if (!NT_STATUS_IS_OK(status)) { @@ -224,15 +222,12 @@ static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) for (i=0;ip, ctx, &r); if (!NT_STATUS_IS_OK(status)) { @@ -361,14 +357,11 @@ static BOOL test_EnumMonitors(struct test_spoolss_context *ctx) for (i=0;ip, ctx, &r); if (!NT_STATUS_IS_OK(status)) { @@ -453,15 +447,12 @@ static BOOL test_EnumPrintProcessors(struct test_spoolss_context *ctx) for (i=0;ip, ctx, &r); if (!NT_STATUS_IS_OK(status)) { @@ -545,14 +537,12 @@ static BOOL test_EnumPrinters(struct test_spoolss_context *ctx) for (i=0;ip, ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("dcerpc_spoolss_EnumPrinters failed - %s\n", nt_errstr(status)); @@ -684,12 +676,10 @@ static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, BOOL ret = True; for (i=0;i Date: Tue, 14 Jun 2005 18:44:22 +0000 Subject: r7580: - add GetPrinterDriverDirectory() idl, torture test and server code - add EnumMonitors() server code and return "Standard TCP/IP Port" - add parsing for opening Ports and Monitors with OpenPrinterEx() metze (This used to be commit 08e6de37bc293e2f000d03b51642964d92d6e95e) --- source4/torture/rpc/spoolss.c | 84 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 5 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 7ae9291cf0..86a8c7155f 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -211,6 +211,78 @@ static BOOL test_EnumPorts(struct test_spoolss_context *ctx) return True; } +static BOOL test_GetPrinterDriverDirectory(struct test_spoolss_context *ctx) +{ + NTSTATUS status; + struct spoolss_GetPrinterDriverDirectory r; + struct { + uint16_t level; + const char *server; + } levels[] = {{ + .level = 1, + .server = "" + },{ + .level = 78, + .server = "" + },{ + .level = 1, + .server = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p)) + },{ + .level = 1024, + .server = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p)) + } + }; + int i; + BOOL ret = True; + + for (i=0;ip, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_GetPrinterDriverDirectory failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + printf("GetPrinterDriverDirectory unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + + blob = data_blob_talloc(ctx, NULL, r.out.needed); + data_blob_clear(&blob); + r.in.buffer = &blob; + r.in.offered = r.out.needed; + + status = dcerpc_spoolss_GetPrinterDriverDirectory(ctx->p, ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("dcerpc_spoolss_GetPrinterDriverDirectory failed - %s\n", nt_errstr(status)); + ret = False; + continue; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("GetPrinterDriverDirectory failed - %s\n", + win_errstr(r.out.result)); + ret = False; + continue; + } + } + + return True; +} + static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) { NTSTATUS status; @@ -223,11 +295,11 @@ static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) int level = levels[i]; DATA_BLOB blob; - r.in.server = ""; - r.in.environment = "Windows NT x86"; - r.in.level = level; - r.in.buffer = NULL; - r.in.offered = 0; + r.in.server = ""; + r.in.environment = SPOOLSS_ARCHITECTURE_NT_X86; + r.in.level = level; + r.in.buffer = NULL; + r.in.offered = 0; printf("Testing EnumPrinterDrivers level %u\n", r.in.level); @@ -1994,6 +2066,8 @@ BOOL torture_rpc_spoolss(void) ret &= test_EnumPorts(ctx); + ret &= test_GetPrinterDriverDirectory(ctx); + ret &= test_EnumPrinterDrivers(ctx); ret &= test_EnumMonitors(ctx); -- cgit From 038628b9c5eb033213e187b38f8260573cbf6b17 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 16 Jun 2005 16:46:42 +0000 Subject: r7642: - test NULL server_name in GetPrinterDriverDirectory() too, (same result as "") - test EnumForms() on the PrintServer (NT4 returns WERR_BADFID) (jerry: how do it get the lists of forms in the printserver gui) metze (This used to be commit fddfe1f04b3ae594e75d702aba4d17ee4d103b8e) --- source4/torture/rpc/spoolss.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 86a8c7155f..d5a57ae79a 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -219,6 +219,9 @@ static BOOL test_GetPrinterDriverDirectory(struct test_spoolss_context *ctx) uint16_t level; const char *server; } levels[] = {{ + .level = 1, + .server = NULL + },{ .level = 1, .server = "" },{ @@ -846,7 +849,7 @@ static BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle) + struct policy_handle *handle, BOOL print_server) { NTSTATUS status; struct spoolss_EnumForms r; @@ -864,6 +867,11 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } + if (print_server && W_ERROR_EQUAL(r.out.result,WERR_BADFID)) { + printf("EnumForms on the PrintServer isn't supported by test server (NT4)\n"); + return True; + } + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { union spoolss_FormInfo *info; int j; @@ -1809,7 +1817,7 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } - if (!test_EnumForms(p, mem_ctx, &handle)) { + if (!test_EnumForms(p, mem_ctx, &handle, False)) { ret = False; } @@ -2064,6 +2072,8 @@ BOOL torture_rpc_spoolss(void) ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture"); ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DsPresent"); + ret &= test_EnumForms(ctx->p, ctx, &ctx->server_handle, True); + ret &= test_EnumPorts(ctx); ret &= test_GetPrinterDriverDirectory(ctx); -- cgit From ffa363218804d46c72015a013cc9a9af2cb6b738 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 16 Jun 2005 21:07:45 +0000 Subject: r7650: fixed a typo (This used to be commit 331afee4ca5bc6a6f7e4fe3333846881424314fe) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index d5a57ae79a..f7bb454335 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -967,7 +967,7 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, { struct spoolss_SetForm sf; - struct spoolss_SetFormInfo1 setform; + struct spoolss_AddFormInfo1 setform; sf.in.handle = handle; sf.in.form_name = form_name; -- cgit From fe94ba6e71eb8d3273d593763f6b6d03fa90113d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 1 Jul 2005 09:05:10 +0000 Subject: r8046: - add somemore failure checks in the RPC-SPOOLSS test - test AddForm on the PrintServer object - GetForm() isn't allowed on the PrintServer object so remove NTPTR function for it - accept the dns name as servername in the spoolss server metze (This used to be commit d8c308a4653d59514915021607fe55c5f2b38749) --- source4/torture/rpc/spoolss.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index f7bb454335..fcbec4e561 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -838,6 +838,17 @@ static BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.buffer = &blob; r.in.offered = r.out.needed; status = dcerpc_spoolss_GetForm(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("GetForm failed - %s\n", + nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("GetForm failed - %s\n", + win_errstr(r.out.result)); + return False; + } if (!r.out.info) { printf("No form info returned\n"); @@ -845,6 +856,13 @@ static BOOL test_GetForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("GetForm failed - %s\n", + win_errstr(r.out.result)); + return False; + } + return True; } @@ -853,6 +871,7 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, { NTSTATUS status; struct spoolss_EnumForms r; + BOOL ret = True; r.in.handle = handle; r.in.level = 1; @@ -890,7 +909,7 @@ static BOOL test_EnumForms(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, info = r.out.info; for (j = 0; j < r.out.count; j++) { - test_GetForm(p, mem_ctx, handle, info[j].info1.form_name); + if (!print_server) ret &= test_GetForm(p, mem_ctx, handle, info[j].info1.form_name); } } @@ -933,7 +952,7 @@ static BOOL test_DeleteForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle) + struct policy_handle *handle, BOOL print_server) { struct spoolss_AddForm r; struct spoolss_AddFormInfo1 addform; @@ -961,10 +980,12 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } if (!W_ERROR_IS_OK(r.out.result)) { - printf("AddForm failed - %s\n", nt_errstr(status)); + printf("AddForm failed - %s\n", win_errstr(r.out.result)); goto done; } + if (!print_server) ret &= test_GetForm(p, mem_ctx, handle, form_name); + { struct spoolss_SetForm sf; struct spoolss_AddFormInfo1 setform; @@ -996,6 +1017,8 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } } + if (!print_server) ret &= test_GetForm(p, mem_ctx, handle, form_name); + done: if (!test_DeleteForm(p, mem_ctx, handle, form_name)) { printf("DeleteForm failed\n"); @@ -1821,7 +1844,7 @@ static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, ret = False; } - if (!test_AddForm(p, mem_ctx, &handle)) { + if (!test_AddForm(p, mem_ctx, &handle, False)) { ret = False; } @@ -2074,6 +2097,8 @@ BOOL torture_rpc_spoolss(void) ret &= test_EnumForms(ctx->p, ctx, &ctx->server_handle, True); + ret &= test_AddForm(ctx->p, ctx, &ctx->server_handle, True); + ret &= test_EnumPorts(ctx); ret &= test_GetPrinterDriverDirectory(ctx); -- cgit From 88df3c81ee283819faed2d521e98b1922c03854d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 1 Jul 2005 11:04:33 +0000 Subject: r8050: - make use of more [value()] properties - the out subcontext's need to have a fixed size of r->in.offered, to make windows clients happy metze (This used to be commit 054e1ca434b2f81de199eeb41cb6233524fc5779) --- source4/torture/rpc/spoolss.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index fcbec4e561..07a8addada 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -100,7 +100,6 @@ static BOOL test_OpenPrinter_server(struct test_spoolss_context *ctx) op.in.printername = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p)); op.in.datatype = NULL; - op.in.devmode_ctr.size = 0; op.in.devmode_ctr.devmode= NULL; op.in.access_mask = 0; op.out.handle = &ctx->server_handle; @@ -1328,9 +1327,7 @@ static BOOL test_PausePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.handle = handle; r.in.level = 0; r.in.info.info1 = NULL; - r.in.devmode_ctr.size = 0; r.in.devmode_ctr.devmode= NULL; - r.in.secdesc_ctr.size = 0; r.in.secdesc_ctr.sd = NULL; r.in.command = SPOOLSS_PRINTER_CONTROL_PAUSE; @@ -1360,9 +1357,7 @@ static BOOL test_ResumePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.handle = handle; r.in.level = 0; r.in.info.info1 = NULL; - r.in.devmode_ctr.size = 0; r.in.devmode_ctr.devmode= NULL; - r.in.secdesc_ctr.size = 0; r.in.secdesc_ctr.sd = NULL; r.in.command = SPOOLSS_PRINTER_CONTROL_RESUME; @@ -1663,7 +1658,6 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, op.in.printername = name; op.in.datatype = NULL; - op.in.devmode_ctr.size = 0; op.in.devmode_ctr.devmode= NULL; op.in.access_mask = 0; op.out.handle = &handle; @@ -1686,7 +1680,6 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, opEx.in.printername = name; opEx.in.datatype = NULL; - opEx.in.devmode_ctr.size = 0; opEx.in.devmode_ctr.devmode = NULL; opEx.in.access_mask = 0; opEx.in.level = 1; @@ -1744,7 +1737,6 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name); r.in.datatype = NULL; - r.in.devmode_ctr.size = 0; r.in.devmode_ctr.devmode= NULL; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.out.handle = &handle; @@ -1794,7 +1786,6 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } r.in.datatype = NULL; - r.in.devmode_ctr.size = 0; r.in.devmode_ctr.devmode= NULL; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.in.level = 1; -- cgit From ccaf752e357833b8acc49b471d78b56ae90c8d0f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 1 Jul 2005 12:19:24 +0000 Subject: r8054: add OSVersion, OSVersionEx, DNSMachineName PrintServerData metze (This used to be commit 47781fccbc9a4fc3867e4c3959a17765c7e4dc71) --- source4/torture/rpc/spoolss.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 07a8addada..33e84a5276 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -2085,6 +2085,9 @@ BOOL torture_rpc_spoolss(void) ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory"); ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture"); ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DsPresent"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersion"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersionEx"); + ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DNSMachineName"); ret &= test_EnumForms(ctx->p, ctx, &ctx->server_handle, True); -- cgit From 1598aaca9579f4e2ca9d1fd539693969a2319a4b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 11 Nov 2005 10:49:55 +0000 Subject: r11676: as tridge uses 0x%llx in his latest commits... try to use it every where and see how portable it is metze (This used to be commit 66a94de5ddd09df858a515555c01aa3d4f7d3e96) --- source4/torture/rpc/spoolss.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 33e84a5276..76c8673d4f 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -80,9 +80,8 @@ struct test_spoolss_context { #define COMPARE_UINT64(c,r,e) do {\ if (c.e != r.e){\ - printf("%s: " #c "." #e " 0x%08X%08X (%llu) doesn't match " #r "." #e " 0x%08X%08X (%llu)\n",\ - __location__, (uint32_t)(c.e >> 32), (uint32_t)(c.e & 0xFFFFFFFF), c.e,\ - (uint32_t)(r.e >> 32), (uint32_t)(r.e & 0xFFFFFFFF), r.e);\ + printf("%s: " #c "." #e " 0x%016llX (%llu) doesn't match " #r "." #e " 0x%016llX (%llu)\n",\ + __location__, c.e, c.e, r.e, r.e);\ ret = False;\ }\ } while(0) -- cgit From acd6a086b341096fcbea1775ce748587fcc8020a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 27 Dec 2005 14:28:01 +0000 Subject: r12510: Change the DCE/RPC interfaces to take a pointer to a dcerpc_interface_table struct rather then a tuple of interface name, UUID and version. This removes the requirement for having a global list of DCE/RPC interfaces, except for these parts of the code that use that list explicitly (ndrdump and the scanner torture test). This should also allow us to remove the hack that put the authservice parameter in the dcerpc_binding struct as it can now be read directly from dcerpc_interface_table. I will now modify some of these functions to take a dcerpc_syntax_id structure rather then a full dcerpc_interface_table. (This used to be commit 8aae0f168e54c01d0866ad6e0da141dbd828574f) --- source4/torture/rpc/spoolss.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 76c8673d4f..89407e33cc 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1622,8 +1622,7 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct return False; } - status = dcerpc_bind_auth_none(p2, DCERPC_SPOOLSS_UUID, - DCERPC_SPOOLSS_VERSION); + status = dcerpc_bind_auth_none(p2, &dcerpc_table_spoolss); if (!NT_STATUS_IS_OK(status)) { printf("Failed to create bind on secondary connection\n"); talloc_free(p2); @@ -2059,11 +2058,7 @@ BOOL torture_rpc_spoolss(void) mem_ctx = talloc_init("torture_rpc_spoolss"); - status = torture_rpc_connection(mem_ctx, - &p, - DCERPC_SPOOLSS_NAME, - DCERPC_SPOOLSS_UUID, - DCERPC_SPOOLSS_VERSION); + status = torture_rpc_connection(mem_ctx, &p, &dcerpc_table_spoolss); if (!NT_STATUS_IS_OK(status)) { talloc_free(mem_ctx); return False; -- cgit From 25bb00fbcd409572e1c19c05fdc42c883936780b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 3 Jan 2006 13:41:17 +0000 Subject: r12693: Move core data structures out of smb.h into core.h torture prototypes in seperate header (This used to be commit 73610639b23ca3743077193fa0b1de7c7f65944d) --- source4/torture/rpc/spoolss.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 89407e33cc..fa2b7df418 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -21,6 +21,7 @@ */ #include "includes.h" +#include "torture/torture.h" #include "librpc/gen_ndr/ndr_spoolss.h" struct test_spoolss_context { -- cgit From eefe30b7d8e17ed744318417954669bacf2b3ac0 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Mar 2006 15:02:05 +0000 Subject: r14379: Build torture/rpc/ as a seperate smbtorture module. Move helper functions for rpc out of torture/torture.c (This used to be commit 1d2d970f3b8aef3f36c2befb94b5dd72c0086639) --- source4/torture/rpc/spoolss.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index fa2b7df418..9cc438d9b8 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -22,6 +22,7 @@ #include "includes.h" #include "torture/torture.h" +#include "torture/rpc/rpc.h" #include "librpc/gen_ndr/ndr_spoolss.h" struct test_spoolss_context { -- cgit From 1060f6b3f621cb70b075a879f129e57f10fdbf8a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 14 Mar 2006 23:35:30 +0000 Subject: r14402: Generate seperate headers for RPC client functions. (This used to be commit 7054ebf0249930843a2baf4d023ae8f62cedb109) --- source4/torture/rpc/spoolss.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 9cc438d9b8..49db6e3967 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -24,6 +24,7 @@ #include "torture/torture.h" #include "torture/rpc/rpc.h" #include "librpc/gen_ndr/ndr_spoolss.h" +#include "librpc/gen_ndr/ndr_spoolss_c.h" struct test_spoolss_context { struct dcerpc_pipe *p; -- cgit From 4f1c8daa36a7a0372c5fd9eab51f3c16ee81c49d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 16 Mar 2006 12:43:28 +0000 Subject: r14470: Remove some unnecessary headers. (This used to be commit f7312dab3b9aba2b2b82e8a6e0c483a32a03a63a) --- source4/torture/rpc/spoolss.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 49db6e3967..eb73bfa36b 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -23,7 +23,6 @@ #include "includes.h" #include "torture/torture.h" #include "torture/rpc/rpc.h" -#include "librpc/gen_ndr/ndr_spoolss.h" #include "librpc/gen_ndr/ndr_spoolss_c.h" struct test_spoolss_context { -- cgit From 909b111f587705a45f63540b39968f1af58a9b5d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 25 Mar 2006 16:01:28 +0000 Subject: r14720: Add torture_context argument to all torture tests (This used to be commit 3c7a5ce29108dd82210dc3e1f00414f545949e1d) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index eb73bfa36b..4011c2bc6c 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -2050,7 +2050,7 @@ static BOOL test_EnumPrinterDrivers_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_c return ret; } -BOOL torture_rpc_spoolss(void) +BOOL torture_rpc_spoolss(struct torture_context *torture) { NTSTATUS status; struct dcerpc_pipe *p; -- cgit From 403530d0ecbb7df31325141e04d1544dda1d5304 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 24 Aug 2006 10:38:06 +0000 Subject: r17787: ifdef out unused macros and generate a smb_panic() when the wrong macro is used on a field. metze (This used to be commit dd0f692d19416c82f237661710b814ba20163605) --- source4/torture/rpc/spoolss.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 4011c2bc6c..05bd987c85 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -64,33 +64,55 @@ struct test_spoolss_context { }\ } while(0) +#define _CHECK_FIELD_SIZE(c,r,e,type) do {\ + if (sizeof(__typeof__(c.e)) != sizeof(type)) { \ + printf(__location__ ":" #c "." #e "field is not " #type "\n"); \ + smb_panic(__location__ ":" #c "." #e "field is not " #type ); \ + ret = False; \ + }\ + if (sizeof(__typeof__(r.e)) != sizeof(type)) { \ + printf(__location__ ":" #r "." #e "field is not " #type "\n"); \ + smb_panic(__location__ ":" #r "." #e "field is not " #type ); \ + ret = False; \ + }\ +} while(0) + +#if 0 /* unused */ #define COMPARE_UINT16(c,r,e) do {\ + _CHECK_FIELD_SIZE(c,r,e,uint16_t); \ if (c.e != r.e){\ - printf("%s: " #c "." #e " 0x%08X (%u) doesn't match " #r "." #e " 0x%08X (%u)\n",\ + printf("%s: " #c "." #e " 0x%04X (%u) doesn't match " #r "." #e " 0x%04X (%u)\n",\ __location__, c.e, c.e, r.e, r.e);\ ret = False;\ }\ } while(0) +#endif #define COMPARE_UINT32(c,r,e) do {\ + _CHECK_FIELD_SIZE(c,r,e,uint32_t); \ if (c.e != r.e){\ - printf("%s: " #c "." #e " 0x%04X (%u) doesn't match " #r "." #e " 0x%04X (%u)\n",\ + printf("%s: " #c "." #e " 0x%08X (%u) doesn't match " #r "." #e " 0x%08X (%u)\n",\ __location__, c.e, c.e, r.e, r.e);\ ret = False;\ }\ } while(0) +#if 0 /* unused */ #define COMPARE_UINT64(c,r,e) do {\ + _CHECK_FIELD_SIZE(c,r,e,uint64_t); \ if (c.e != r.e){\ printf("%s: " #c "." #e " 0x%016llX (%llu) doesn't match " #r "." #e " 0x%016llX (%llu)\n",\ __location__, c.e, c.e, r.e, r.e);\ ret = False;\ }\ } while(0) +#endif /* TODO: ! */ +#if 0 /* unused */ #define COMPARE_SEC_DESC(c,r,e) #define COMPARE_SPOOLSS_TIME(c,r,e) +#endif #define COMPARE_STRING_ARRAY(c,r,e) static BOOL test_OpenPrinter_server(struct test_spoolss_context *ctx) -- cgit From 5dd8496af6f0e4a245ee3a365e2d9a440692fa05 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 3 Jul 2007 16:27:35 +0000 Subject: r23687: not every compiler supports __typeof__() metze (This used to be commit d0f77f7bd7520f4cd61c0d0199b917895ea85a1c) --- source4/torture/rpc/spoolss.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 05bd987c85..e184223140 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -64,6 +64,8 @@ struct test_spoolss_context { }\ } while(0) +/* not every compiler supports __typeof__() */ +#if (__GNUC__ >= 3) #define _CHECK_FIELD_SIZE(c,r,e,type) do {\ if (sizeof(__typeof__(c.e)) != sizeof(type)) { \ printf(__location__ ":" #c "." #e "field is not " #type "\n"); \ @@ -76,6 +78,9 @@ struct test_spoolss_context { ret = False; \ }\ } while(0) +#else +#define _CHECK_FIELD_SIZE(c,r,e,type) do {} while(0) +#endif #if 0 /* unused */ #define COMPARE_UINT16(c,r,e) do {\ -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/torture/rpc/spoolss.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index e184223140..bfedfc9d5c 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -7,7 +7,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,8 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #include "includes.h" -- cgit From f14bd1a90ab47a418c0ec2492990a417a0bb3bf6 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 19 Aug 2007 21:23:03 +0000 Subject: r24557: rename 'dcerpc_table_' -> 'ndr_table_' metze (This used to be commit 84651aee81aaabbebf52ffc3fbcbabb2eec6eed5) --- source4/torture/rpc/spoolss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index bfedfc9d5c..2b07b326aa 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1650,7 +1650,7 @@ static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ct return False; } - status = dcerpc_bind_auth_none(p2, &dcerpc_table_spoolss); + status = dcerpc_bind_auth_none(p2, &ndr_table_spoolss); if (!NT_STATUS_IS_OK(status)) { printf("Failed to create bind on secondary connection\n"); talloc_free(p2); @@ -2086,7 +2086,7 @@ BOOL torture_rpc_spoolss(struct torture_context *torture) mem_ctx = talloc_init("torture_rpc_spoolss"); - status = torture_rpc_connection(mem_ctx, &p, &dcerpc_table_spoolss); + status = torture_rpc_connection(mem_ctx, &p, &ndr_table_spoolss); if (!NT_STATUS_IS_OK(status)) { talloc_free(mem_ctx); return False; -- cgit From 919aa6b27e5fe49b70c814210aa026c19be66e8a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 28 Aug 2007 12:54:27 +0000 Subject: r24735: Use torture API in more places. (This used to be commit 1319d88c099496be29dd9214fa2492c81e848369) --- source4/torture/rpc/spoolss.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 2b07b326aa..a9232f6df3 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -2076,17 +2076,17 @@ static BOOL test_EnumPrinterDrivers_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_c return ret; } -BOOL torture_rpc_spoolss(struct torture_context *torture) +bool torture_rpc_spoolss(struct torture_context *torture) { - NTSTATUS status; - struct dcerpc_pipe *p; + NTSTATUS status; + struct dcerpc_pipe *p; TALLOC_CTX *mem_ctx; BOOL ret = True; struct test_spoolss_context *ctx; mem_ctx = talloc_init("torture_rpc_spoolss"); - status = torture_rpc_connection(mem_ctx, &p, &ndr_table_spoolss); + status = torture_rpc_connection(torture, &p, &ndr_table_spoolss); if (!NT_STATUS_IS_OK(status)) { talloc_free(mem_ctx); return False; -- cgit From 3e7203d0b34a031e10aeaaf04f246a1de8376ab4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 28 Aug 2007 19:03:08 +0000 Subject: r24755: Use common code for finding the RPC binding in the torture tests. (This used to be commit e3310e773924ddd2129e8ca1a86e23d0f713c19c) --- source4/torture/rpc/spoolss.c | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index a9232f6df3..0bf0ee87a1 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -2080,19 +2080,15 @@ bool torture_rpc_spoolss(struct torture_context *torture) { NTSTATUS status; struct dcerpc_pipe *p; - TALLOC_CTX *mem_ctx; BOOL ret = True; struct test_spoolss_context *ctx; - mem_ctx = talloc_init("torture_rpc_spoolss"); - status = torture_rpc_connection(torture, &p, &ndr_table_spoolss); if (!NT_STATUS_IS_OK(status)) { - talloc_free(mem_ctx); return False; } - ctx = talloc_zero(mem_ctx, struct test_spoolss_context); + ctx = talloc_zero(torture, struct test_spoolss_context); ctx->p = p; ret &= test_OpenPrinter_server(ctx); @@ -2110,34 +2106,19 @@ bool torture_rpc_spoolss(struct torture_context *torture) ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersion"); ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersionEx"); ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DNSMachineName"); - ret &= test_EnumForms(ctx->p, ctx, &ctx->server_handle, True); - ret &= test_AddForm(ctx->p, ctx, &ctx->server_handle, True); - ret &= test_EnumPorts(ctx); - ret &= test_GetPrinterDriverDirectory(ctx); - ret &= test_EnumPrinterDrivers(ctx); - ret &= test_EnumMonitors(ctx); - ret &= test_EnumPrintProcessors(ctx); - ret &= test_EnumPrinters(ctx); - - ret &= test_OpenPrinter_badnames(p, mem_ctx); - - ret &= test_AddPort(p, mem_ctx); - - ret &= test_EnumPorts_old(p, mem_ctx); - - ret &= test_EnumPrinters_old(p, mem_ctx); - - ret &= test_EnumPrinterDrivers_old(p, mem_ctx); - - talloc_free(mem_ctx); + ret &= test_OpenPrinter_badnames(p, torture); + ret &= test_AddPort(p, torture); + ret &= test_EnumPorts_old(p, torture); + ret &= test_EnumPrinters_old(p, torture); + ret &= test_EnumPrinterDrivers_old(p, torture); return ret; } -- cgit From 8e2d624a588552f5d06f21fe37281615f3ec6296 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 3 Sep 2007 13:13:25 +0000 Subject: r24937: Merge tests spoolss RPC callbacks. (This used to be commit 9b256a0ca232ea6e89771bf73a1adf877273a752) --- source4/torture/rpc/spoolss.c | 1517 ++++++++++++++++------------------------- 1 file changed, 576 insertions(+), 941 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 0bf0ee87a1..0a0abc5740 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -4,6 +4,7 @@ Copyright (C) Tim Potter 2003 Copyright (C) Stefan Metzmacher 2005 + Copyright (C) Jelmer Vernooij 2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,8 +26,6 @@ #include "librpc/gen_ndr/ndr_spoolss_c.h" struct test_spoolss_context { - struct dcerpc_pipe *p; - /* print server handle */ struct policy_handle server_handle; @@ -51,109 +50,58 @@ struct test_spoolss_context { union spoolss_PrinterInfo *printers[6]; }; -#define COMPARE_STRING(c,r,e) do {\ - BOOL _ok = True;\ - if (c.e && !r.e) _ok = False;\ - if (!c.e && r.e) _ok = False;\ - if (c.e && r.e && strcmp_safe(c.e, r.e) != 0) _ok = False;\ - if (!_ok){\ - printf("%s: " #c "." #e " [%s] doesn't match " #r "." #e " [%s]\n",\ - __location__, c.e, r.e);\ - ret = False;\ - }\ -} while(0) +#define COMPARE_STRING(tctx, c,r,e) \ + torture_assert_str_equal(tctx, c.e, r.e, "invalid value") /* not every compiler supports __typeof__() */ #if (__GNUC__ >= 3) #define _CHECK_FIELD_SIZE(c,r,e,type) do {\ if (sizeof(__typeof__(c.e)) != sizeof(type)) { \ - printf(__location__ ":" #c "." #e "field is not " #type "\n"); \ - smb_panic(__location__ ":" #c "." #e "field is not " #type ); \ - ret = False; \ + torture_fail(tctx, #c "." #e "field is not " #type "\n"); \ }\ if (sizeof(__typeof__(r.e)) != sizeof(type)) { \ - printf(__location__ ":" #r "." #e "field is not " #type "\n"); \ - smb_panic(__location__ ":" #r "." #e "field is not " #type ); \ - ret = False; \ + torture_fail(tctx, #r "." #e "field is not " #type "\n"); \ }\ } while(0) #else #define _CHECK_FIELD_SIZE(c,r,e,type) do {} while(0) #endif -#if 0 /* unused */ -#define COMPARE_UINT16(c,r,e) do {\ - _CHECK_FIELD_SIZE(c,r,e,uint16_t); \ - if (c.e != r.e){\ - printf("%s: " #c "." #e " 0x%04X (%u) doesn't match " #r "." #e " 0x%04X (%u)\n",\ - __location__, c.e, c.e, r.e, r.e);\ - ret = False;\ - }\ +#define COMPARE_UINT32(tctx, c, r, e) do {\ + _CHECK_FIELD_SIZE(c, r, e,uint32_t); \ + torture_assert_int_equal(tctx, c.e, r.e, "invalid value"); \ } while(0) -#endif -#define COMPARE_UINT32(c,r,e) do {\ - _CHECK_FIELD_SIZE(c,r,e,uint32_t); \ - if (c.e != r.e){\ - printf("%s: " #c "." #e " 0x%08X (%u) doesn't match " #r "." #e " 0x%08X (%u)\n",\ - __location__, c.e, c.e, r.e, r.e);\ - ret = False;\ - }\ -} while(0) +#define COMPARE_STRING_ARRAY(tctx, c,r,e) -#if 0 /* unused */ -#define COMPARE_UINT64(c,r,e) do {\ - _CHECK_FIELD_SIZE(c,r,e,uint64_t); \ - if (c.e != r.e){\ - printf("%s: " #c "." #e " 0x%016llX (%llu) doesn't match " #r "." #e " 0x%016llX (%llu)\n",\ - __location__, c.e, c.e, r.e, r.e);\ - ret = False;\ - }\ -} while(0) -#endif - -/* TODO: ! */ -#if 0 /* unused */ -#define COMPARE_SEC_DESC(c,r,e) -#define COMPARE_SPOOLSS_TIME(c,r,e) -#endif -#define COMPARE_STRING_ARRAY(c,r,e) - -static BOOL test_OpenPrinter_server(struct test_spoolss_context *ctx) +static bool test_OpenPrinter_server(struct torture_context *tctx, struct dcerpc_pipe *p, struct test_spoolss_context *ctx) { NTSTATUS status; struct spoolss_OpenPrinter op; - BOOL ret = True; - op.in.printername = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p)); + op.in.printername = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(p)); op.in.datatype = NULL; op.in.devmode_ctr.devmode= NULL; op.in.access_mask = 0; op.out.handle = &ctx->server_handle; - printf("\nTesting OpenPrinter(%s)\n", op.in.printername); + torture_comment(tctx, "Testing OpenPrinter(%s)\n", op.in.printername); - status = dcerpc_spoolss_OpenPrinter(ctx->p, ctx, &op); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_OpenPrinter failed - %s\n", nt_errstr(status)); - ret = False; - } - if (!W_ERROR_IS_OK(op.out.result)) { - printf("OpenPrinter(%s) failed - %s\n", - op.in.printername, win_errstr(op.out.result)); - ret = False; - } + status = dcerpc_spoolss_OpenPrinter(p, ctx, &op); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_OpenPrinter failed"); + torture_assert_werr_ok(tctx, op.out.result, "dcerpc_spoolss_OpenPrinter failed"); - return ret; + return true; } -static BOOL test_EnumPorts(struct test_spoolss_context *ctx) +static bool test_EnumPorts(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct test_spoolss_context *ctx) { NTSTATUS status; struct spoolss_EnumPorts r; uint16_t levels[] = { 1, 2 }; int i, j; - BOOL ret = True; for (i=0;ip, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPorts failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPorts(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPorts failed"); if (W_ERROR_IS_OK(r.out.result)) { /* TODO: do some more checks here */ continue; } - if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { - printf("EnumPorts unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, + "EnumPorts unexpected return code"); blob = data_blob_talloc(ctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; - status = dcerpc_spoolss_EnumPorts(ctx->p, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPorts failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPorts(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPorts failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("EnumPorts failed - %s\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_ok(tctx, r.out.result, "EnumPorts failed"); ctx->port_count[level] = r.out.count; ctx->ports[level] = r.out.info; @@ -209,14 +140,10 @@ static BOOL test_EnumPorts(struct test_spoolss_context *ctx) for (i=1;iport_count[level] != ctx->port_count[old_level]) { - printf("EnumPorts level[%d] returns [%u] ports, but level[%d] returns [%u]\n", - level, ctx->port_count[level], old_level, ctx->port_count[old_level]); - ret = False; - } + torture_assert_int_equal(tctx, ctx->port_count[level], ctx->port_count[old_level], + "EnumPorts invalid value"); } /* if the array sizes are not the same we would maybe segfault in the following code */ - if (!ret) return ret; for (i=0;iports[2][j]; switch (level) { case 1: - COMPARE_STRING(cur->info1, ref->info2, port_name); + COMPARE_STRING(tctx, cur->info1, ref->info2, port_name); break; case 2: /* level 2 is our reference, and it makes no sense to compare it to itself */ @@ -234,10 +161,12 @@ static BOOL test_EnumPorts(struct test_spoolss_context *ctx) } } - return True; + return true; } -static BOOL test_GetPrinterDriverDirectory(struct test_spoolss_context *ctx) +static bool test_GetPrinterDriverDirectory(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct test_spoolss_context *ctx) { NTSTATUS status; struct spoolss_GetPrinterDriverDirectory r; @@ -255,14 +184,13 @@ static BOOL test_GetPrinterDriverDirectory(struct test_spoolss_context *ctx) .server = "" },{ .level = 1, - .server = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p)) + .server = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(p)) },{ .level = 1024, - .server = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p)) + .server = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(p)) } }; int i; - BOOL ret = True; for (i=0;ip, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_GetPrinterDriverDirectory failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } - if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { - printf("GetPrinterDriverDirectory unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + status = dcerpc_spoolss_GetPrinterDriverDirectory(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, + "dcerpc_spoolss_GetPrinterDriverDirectory failed"); + torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, + "GetPrinterDriverDirectory unexpected return code"); blob = data_blob_talloc(ctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; - status = dcerpc_spoolss_GetPrinterDriverDirectory(ctx->p, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_GetPrinterDriverDirectory failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_GetPrinterDriverDirectory(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_GetPrinterDriverDirectory failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("GetPrinterDriverDirectory failed - %s\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_ok(tctx, r.out.result, "GetPrinterDriverDirectory failed"); } - return True; + return true; } -static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) +static bool test_EnumPrinterDrivers(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct test_spoolss_context *ctx) { NTSTATUS status; struct spoolss_EnumPrinterDrivers r; uint16_t levels[] = { 1, 2, 3, 4, 5, 6 }; int i, j; - BOOL ret = True; for (i=0;ip, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPrinterDrivers failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPrinterDrivers(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, + "dcerpc_spoolss_EnumPrinterDrivers failed"); if (W_ERROR_IS_OK(r.out.result)) { /* TODO: do some more checks here */ continue; } - if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { - printf("EnumPrinterDrivers unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, + "EnumPrinterDrivers failed"); blob = data_blob_talloc(ctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; - status = dcerpc_spoolss_EnumPrinterDrivers(ctx->p, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPrinterDrivers failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPrinterDrivers(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinterDrivers failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("EnumPrinterDrivers failed - %s\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed"); ctx->driver_count[level] = r.out.count; ctx->drivers[level] = r.out.info; @@ -375,14 +272,9 @@ static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) for (i=1;idriver_count[level] != ctx->driver_count[old_level]) { - printf("EnumPrinterDrivers level[%d] returns [%u] drivers, but level[%d] returns [%u]\n", - level, ctx->driver_count[level], old_level, ctx->driver_count[old_level]); - ret = False; - } + torture_assert_int_equal(tctx, ctx->driver_count[level], ctx->driver_count[old_level], + "EnumPrinterDrivers invalid value"); } - /* if the array sizes are not the same we would maybe segfault in the following code */ - if (!ret) return ret; for (i=0;idrivers[6][j]; switch (level) { case 1: - COMPARE_STRING(cur->info1, ref->info6, driver_name); + COMPARE_STRING(tctx, cur->info1, ref->info6, driver_name); break; case 2: - COMPARE_UINT32(cur->info2, ref->info6, version); - COMPARE_STRING(cur->info2, ref->info6, driver_name); - COMPARE_STRING(cur->info2, ref->info6, architecture); - COMPARE_STRING(cur->info2, ref->info6, driver_path); - COMPARE_STRING(cur->info2, ref->info6, data_file); - COMPARE_STRING(cur->info2, ref->info6, config_file); + COMPARE_UINT32(tctx, cur->info2, ref->info6, version); + COMPARE_STRING(tctx, cur->info2, ref->info6, driver_name); + COMPARE_STRING(tctx, cur->info2, ref->info6, architecture); + COMPARE_STRING(tctx, cur->info2, ref->info6, driver_path); + COMPARE_STRING(tctx, cur->info2, ref->info6, data_file); + COMPARE_STRING(tctx, cur->info2, ref->info6, config_file); break; case 3: - COMPARE_UINT32(cur->info3, ref->info6, version); - COMPARE_STRING(cur->info3, ref->info6, driver_name); - COMPARE_STRING(cur->info3, ref->info6, architecture); - COMPARE_STRING(cur->info3, ref->info6, driver_path); - COMPARE_STRING(cur->info3, ref->info6, data_file); - COMPARE_STRING(cur->info3, ref->info6, config_file); - COMPARE_STRING(cur->info3, ref->info6, help_file); - COMPARE_STRING_ARRAY(cur->info3, ref->info6, dependent_files); - COMPARE_STRING(cur->info3, ref->info6, monitor_name); - COMPARE_STRING(cur->info3, ref->info6, default_datatype); + COMPARE_UINT32(tctx, cur->info3, ref->info6, version); + COMPARE_STRING(tctx, cur->info3, ref->info6, driver_name); + COMPARE_STRING(tctx, cur->info3, ref->info6, architecture); + COMPARE_STRING(tctx, cur->info3, ref->info6, driver_path); + COMPARE_STRING(tctx, cur->info3, ref->info6, data_file); + COMPARE_STRING(tctx, cur->info3, ref->info6, config_file); + COMPARE_STRING(tctx, cur->info3, ref->info6, help_file); + COMPARE_STRING_ARRAY(tctx, cur->info3, ref->info6, dependent_files); + COMPARE_STRING(tctx, cur->info3, ref->info6, monitor_name); + COMPARE_STRING(tctx, cur->info3, ref->info6, default_datatype); break; case 4: - COMPARE_UINT32(cur->info4, ref->info6, version); - COMPARE_STRING(cur->info4, ref->info6, driver_name); - COMPARE_STRING(cur->info4, ref->info6, architecture); - COMPARE_STRING(cur->info4, ref->info6, driver_path); - COMPARE_STRING(cur->info4, ref->info6, data_file); - COMPARE_STRING(cur->info4, ref->info6, config_file); - COMPARE_STRING(cur->info4, ref->info6, help_file); - COMPARE_STRING_ARRAY(cur->info4, ref->info6, dependent_files); - COMPARE_STRING(cur->info4, ref->info6, monitor_name); - COMPARE_STRING(cur->info4, ref->info6, default_datatype); - COMPARE_STRING_ARRAY(cur->info4, ref->info6, previous_names); + COMPARE_UINT32(tctx, cur->info4, ref->info6, version); + COMPARE_STRING(tctx, cur->info4, ref->info6, driver_name); + COMPARE_STRING(tctx, cur->info4, ref->info6, architecture); + COMPARE_STRING(tctx, cur->info4, ref->info6, driver_path); + COMPARE_STRING(tctx, cur->info4, ref->info6, data_file); + COMPARE_STRING(tctx, cur->info4, ref->info6, config_file); + COMPARE_STRING(tctx, cur->info4, ref->info6, help_file); + COMPARE_STRING_ARRAY(tctx, cur->info4, ref->info6, dependent_files); + COMPARE_STRING(tctx, cur->info4, ref->info6, monitor_name); + COMPARE_STRING(tctx, cur->info4, ref->info6, default_datatype); + COMPARE_STRING_ARRAY(tctx, cur->info4, ref->info6, previous_names); break; case 5: - COMPARE_UINT32(cur->info5, ref->info6, version); - COMPARE_STRING(cur->info5, ref->info6, driver_name); - COMPARE_STRING(cur->info5, ref->info6, architecture); - COMPARE_STRING(cur->info5, ref->info6, driver_path); - COMPARE_STRING(cur->info5, ref->info6, data_file); - COMPARE_STRING(cur->info5, ref->info6, config_file); - /*COMPARE_UINT32(cur->info5, ref->info6, driver_attributes);*/ - /*COMPARE_UINT32(cur->info5, ref->info6, config_version);*/ - /*TODO: ! COMPARE_UINT32(cur->info5, ref->info6, driver_version); */ + COMPARE_UINT32(tctx, cur->info5, ref->info6, version); + COMPARE_STRING(tctx, cur->info5, ref->info6, driver_name); + COMPARE_STRING(tctx, cur->info5, ref->info6, architecture); + COMPARE_STRING(tctx, cur->info5, ref->info6, driver_path); + COMPARE_STRING(tctx, cur->info5, ref->info6, data_file); + COMPARE_STRING(tctx, cur->info5, ref->info6, config_file); + /*COMPARE_UINT32(tctx, cur->info5, ref->info6, driver_attributes);*/ + /*COMPARE_UINT32(tctx, cur->info5, ref->info6, config_version);*/ + /*TODO: ! COMPARE_UINT32(tctx, cur->info5, ref->info6, driver_version); */ break; case 6: /* level 6 is our reference, and it makes no sense to compare it to itself */ @@ -444,16 +336,17 @@ static BOOL test_EnumPrinterDrivers(struct test_spoolss_context *ctx) } } - return ret; + return true; } -static BOOL test_EnumMonitors(struct test_spoolss_context *ctx) +static bool test_EnumMonitors(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct test_spoolss_context *ctx) { NTSTATUS status; struct spoolss_EnumMonitors r; uint16_t levels[] = { 1, 2 }; int i, j; - BOOL ret = True; for (i=0;ip, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumMonitors failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumMonitors(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumMonitors failed"); if (W_ERROR_IS_OK(r.out.result)) { /* TODO: do some more checks here */ continue; } - if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { - printf("EnumMonitors unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, + "EnumMonitors failed"); blob = data_blob_talloc(ctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; - status = dcerpc_spoolss_EnumMonitors(ctx->p, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumMonitors failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumMonitors(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumMonitors failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("EnumMonitors failed - %s\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_ok(tctx, r.out.result, "EnumMonitors failed"); ctx->monitor_count[level] = r.out.count; ctx->monitors[level] = r.out.info; @@ -509,14 +385,9 @@ static BOOL test_EnumMonitors(struct test_spoolss_context *ctx) for (i=1;imonitor_count[level] != ctx->monitor_count[old_level]) { - printf("EnumMonitors level[%d] returns [%u] monitors, but level[%d] returns [%u]\n", - level, ctx->monitor_count[level], old_level, ctx->monitor_count[old_level]); - ret = False; - } + torture_assert_int_equal(tctx, ctx->monitor_count[level], ctx->monitor_count[old_level], + "EnumMonitors invalid value"); } - /* if the array sizes are not the same we would maybe segfault in the following code */ - if (!ret) return ret; for (i=0;imonitors[2][j]; switch (level) { case 1: - COMPARE_STRING(cur->info1, ref->info2, monitor_name); + COMPARE_STRING(tctx, cur->info1, ref->info2, monitor_name); break; case 2: /* level 2 is our reference, and it makes no sense to compare it to itself */ @@ -534,16 +405,17 @@ static BOOL test_EnumMonitors(struct test_spoolss_context *ctx) } } - return ret; + return true; } -static BOOL test_EnumPrintProcessors(struct test_spoolss_context *ctx) +static bool test_EnumPrintProcessors(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct test_spoolss_context *ctx) { NTSTATUS status; struct spoolss_EnumPrintProcessors r; uint16_t levels[] = { 1 }; int i, j; - BOOL ret = True; for (i=0;ip, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPrintProcessors failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPrintProcessors(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrintProcessors failed"); if (W_ERROR_IS_OK(r.out.result)) { /* TODO: do some more checks here */ continue; } - if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { - printf("EnumPrintProcessors unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, + "EnumPrintProcessors unexpected return code"); blob = data_blob_talloc(ctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; - status = dcerpc_spoolss_EnumPrintProcessors(ctx->p, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPrintProcessors failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPrintProcessors(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrintProcessors failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("EnumPrintProcessors failed - %s\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_ok(tctx, r.out.result, "EnumPrintProcessors failed"); ctx->print_processor_count[level] = r.out.count; ctx->print_processors[level] = r.out.info; @@ -600,14 +455,9 @@ static BOOL test_EnumPrintProcessors(struct test_spoolss_context *ctx) for (i=1;iprint_processor_count[level] != ctx->print_processor_count[old_level]) { - printf("EnumPrintProcessors level[%d] returns [%u] print_processors, but level[%d] returns [%u]\n", - level, ctx->print_processor_count[level], old_level, ctx->print_processor_count[old_level]); - ret = False; - } + torture_assert_int_equal(tctx, ctx->print_processor_count[level], ctx->print_processor_count[old_level], + "EnumPrintProcessors failed"); } - /* if the array sizes are not the same we would maybe segfault in the following code */ - if (!ret) return ret; for (i=0;ip, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPrinters failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPrinters(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinters failed"); if (W_ERROR_IS_OK(r.out.result)) { /* TODO: do some more checks here */ continue; } - if (!W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { - printf("EnumPrinters unexspected return code %s, should be WERR_INSUFFICIENT_BUFFER\n", - win_errstr(r.out.result)); - ret = False; - continue; - } + torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, + "EnumPrinters unexpected return code"); blob = data_blob_talloc(ctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; - status = dcerpc_spoolss_EnumPrinters(ctx->p, ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("dcerpc_spoolss_EnumPrinters failed - %s\n", nt_errstr(status)); - ret = False; - continue; - } + status = dcerpc_spoolss_EnumPrinters(p, ctx, &r); + torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinters failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("EnumPrinters failed - %s\n", - win_errstr(r.out.result)); - continue; - } + torture_assert_werr_ok(tctx, r.out.result, "EnumPrinters failed"); ctx->printer_count[level] = r.out.count; ctx->printers[level] = r.out.info; @@ -689,14 +524,9 @@ static BOOL test_EnumPrinters(struct test_spoolss_context *ctx) for (i=1;iprinter_count[level] != ctx->printer_count[old_level]) { - printf("EnumPrinters level[%d] returns [%u] printers, but level[%d] returns [%u]\n", - level, ctx->printer_count[level], old_level, ctx->printer_count[old_level]); - ret = False; - } + torture_assert_int_equal(tctx, ctx->printer_count[level], ctx->printer_count[old_level], + "EnumPrinters invalid value"); } - /* if the array sizes are not the same we would maybe segfault in the following code */ - if (!ret) return ret; for (i=0;iprinters[2][j]; switch (level) { case 0: - COMPARE_STRING(cur->info0, ref->info2, printername); - COMPARE_STRING(cur->info0, ref->info2, servername); - COMPARE_UINT32(cur->info0, ref->info2, cjobs); - /*COMPARE_UINT32(cur->info0, ref->info2, total_jobs); - COMPARE_UINT32(cur->info0, ref->info2, total_bytes); + COMPARE_STRING(tctx, cur->info0, ref->info2, printername); + COMPARE_STRING(tctx, cur->info0, ref->info2, servername); + COMPARE_UINT32(tctx, cur->info0, ref->info2, cjobs); + /*COMPARE_UINT32(tctx, cur->info0, ref->info2, total_jobs); + COMPARE_UINT32(tctx, cur->info0, ref->info2, total_bytes); COMPARE_SPOOLSS_TIME(cur->info0, ref->info2, spoolss_Time time); - COMPARE_UINT32(cur->info0, ref->info2, global_counter); - COMPARE_UINT32(cur->info0, ref->info2, total_pages); - COMPARE_UINT32(cur->info0, ref->info2, version); - COMPARE_UINT32(cur->info0, ref->info2, unknown10); - COMPARE_UINT32(cur->info0, ref->info2, unknown11); - COMPARE_UINT32(cur->info0, ref->info2, unknown12); - COMPARE_UINT32(cur->info0, ref->info2, session_counter); - COMPARE_UINT32(cur->info0, ref->info2, unknown14); - COMPARE_UINT32(cur->info0, ref->info2, printer_errors); - COMPARE_UINT32(cur->info0, ref->info2, unknown16); - COMPARE_UINT32(cur->info0, ref->info2, unknown17); - COMPARE_UINT32(cur->info0, ref->info2, unknown18); - COMPARE_UINT32(cur->info0, ref->info2, unknown19); - COMPARE_UINT32(cur->info0, ref->info2, change_id); - COMPARE_UINT32(cur->info0, ref->info2, unknown21);*/ - COMPARE_UINT32(cur->info0, ref->info2, status); - /*COMPARE_UINT32(cur->info0, ref->info2, unknown23); - COMPARE_UINT32(cur->info0, ref->info2, c_setprinter); + COMPARE_UINT32(tctx, cur->info0, ref->info2, global_counter); + COMPARE_UINT32(tctx, cur->info0, ref->info2, total_pages); + COMPARE_UINT32(tctx, cur->info0, ref->info2, version); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown10); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown11); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown12); + COMPARE_UINT32(tctx, cur->info0, ref->info2, session_counter); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown14); + COMPARE_UINT32(tctx, cur->info0, ref->info2, printer_errors); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown16); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown17); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown18); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown19); + COMPARE_UINT32(tctx, cur->info0, ref->info2, change_id); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown21);*/ + COMPARE_UINT32(tctx, cur->info0, ref->info2, status); + /*COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown23); + COMPARE_UINT32(tctx, cur->info0, ref->info2, c_setprinter); COMPARE_UINT16(cur->info0, ref->info2, unknown25); COMPARE_UINT16(cur->info0, ref->info2, unknown26); - COMPARE_UINT32(cur->info0, ref->info2, unknown27); - COMPARE_UINT32(cur->info0, ref->info2, unknown28); - COMPARE_UINT32(cur->info0, ref->info2, unknown29);*/ + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown27); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown28); + COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown29);*/ break; case 1: - /*COMPARE_UINT32(cur->info1, ref->info2, flags);*/ - /*COMPARE_STRING(cur->info1, ref->info2, name);*/ - /*COMPARE_STRING(cur->info1, ref->info2, description);*/ - COMPARE_STRING(cur->info1, ref->info2, comment); + /*COMPARE_UINT32(tctx, cur->info1, ref->info2, flags);*/ + /*COMPARE_STRING(tctx, cur->info1, ref->info2, name);*/ + /*COMPARE_STRING(tctx, cur->info1, ref->info2, description);*/ + COMPARE_STRING(tctx, cur->info1, ref->info2, comment); break; case 2: /* level 2 is our reference, and it makes no sense to compare it to itself */ break; case 4: - COMPARE_STRING(cur->info4, ref->info2, printername); - COMPARE_STRING(cur->info4, ref->info2, servername); - COMPARE_UINT32(cur->info4, ref->info2, attributes); + COMPARE_STRING(tctx, cur->info4, ref->info2, printername); + COMPARE_STRING(tctx, cur->info4, ref->info2, servername); + COMPARE_UINT32(tctx, cur->info4, ref->info2, attributes); break; case 5: - COMPARE_STRING(cur->info5, ref->info2, printername); - COMPARE_STRING(cur->info5, ref->info2, portname); - COMPARE_UINT32(cur->info5, ref->info2, attributes); - /*COMPARE_UINT32(cur->info5, ref->info2, device_not_selected_timeout); - COMPARE_UINT32(cur->info5, ref->info2, transmission_retry_timeout);*/ + COMPARE_STRING(tctx, cur->info5, ref->info2, printername); + COMPARE_STRING(tctx, cur->info5, ref->info2, portname); + COMPARE_UINT32(tctx, cur->info5, ref->info2, attributes); + /*COMPARE_UINT32(tctx, cur->info5, ref->info2, device_not_selected_timeout); + COMPARE_UINT32(tctx, cur->info5, ref->info2, transmission_retry_timeout);*/ break; } } @@ -764,17 +594,17 @@ static BOOL test_EnumPrinters(struct test_spoolss_context *ctx) * - verify that the port of a printer was in the list returned by EnumPorts */ - return ret; + return true; } -static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool test_GetPrinter(struct torture_context *tctx, + struct dcerpc_pipe *p, struct policy_handle *handle) { NTSTATUS status; struct spoolss_GetPrinter r; uint16_t levels[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; int i; - BOOL ret = True; for (i=0;ilast_fault_code == DCERPC_FAULT_OP_RNG_ERROR) { - printf("GetPrinterDataEx not supported by server\n"); - return True; + torture_skip(tctx, "GetPrinterDataEx not supported by server\n"); } - printf("GetPrinterDataEx failed - %s\n", nt_errstr(status)); - return False; + torture_assert_ntstatus_ok(tctx, status, "GetPrinterDataEx failed"); } if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { r.in.offered = r.out.needed; - status = dcerpc_spoolss_GetPrinterDataEx(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("GetPrinterDataEx failed - %s\n", - nt_errstr(status)); - return False; - } + status = dcerpc_spoolss_GetPrinterDataEx(p, tctx, &r); + torture_assert_ntstatus_ok(tctx, status, "GetPrinterDataEx failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("GetPrinterDataEx failed - %s\n", - win_errstr(r.out.result)); - return False; - } + torture_assert_werr_ok(tctx, r.out.result, "GetPrinterDataEx failed"); } - return True; + return true; } -static BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle) { NTSTATUS status; @@ -1507,28 +1189,22 @@ static BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.data_size = &data_size; r.out.data_size = &data_size; - printf("Testing EnumPrinterData\n"); + torture_comment(tctx, "Testing EnumPrinterData\n"); - status = dcerpc_spoolss_EnumPrinterData(p, mem_ctx, &r); + status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("EnumPrinterData failed - %s\n", nt_errstr(status)); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed"); r.in.value_offered = r.out.value_needed; - status = dcerpc_spoolss_EnumPrinterData(p, mem_ctx, &r); + status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("EnumPrinterData failed - %s\n", nt_errstr(status)); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed"); - test_GetPrinterData(p, mem_ctx, handle, r.out.value_name); + test_GetPrinterData(tctx, p, handle, r.out.value_name); - test_GetPrinterDataEx( - p, mem_ctx, handle, "PrinterDriverData", + test_GetPrinterDataEx(tctx, + p, handle, "PrinterDriverData", r.out.value_name); r.in.enum_index++; @@ -1538,7 +1214,8 @@ static BOOL test_EnumPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } -static BOOL test_EnumPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool test_EnumPrinterDataEx(struct torture_context *tctx, + struct dcerpc_pipe *p, struct policy_handle *handle) { NTSTATUS status; @@ -1548,28 +1225,23 @@ static BOOL test_EnumPrinterDataEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.key_name = "PrinterDriverData"; r.in.offered = 0; - printf("Testing EnumPrinterDataEx\n"); + torture_comment(tctx, "Testing EnumPrinterDataEx\n"); - status = dcerpc_spoolss_EnumPrinterDataEx(p, mem_ctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("EnumPrinterDataEx failed - %s\n", nt_errstr(status)); - return False; - } + status = dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r); + torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDataEx failed"); r.in.offered = r.out.needed; - status = dcerpc_spoolss_EnumPrinterDataEx(p, mem_ctx, &r); + status = dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("EnumPrinterDataEx failed - %s\n", nt_errstr(status)); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDataEx failed"); - return True; + return true; } -static BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool test_DeletePrinterData(struct torture_context *tctx, + struct dcerpc_pipe *p, struct policy_handle *handle, const char *value_name) { @@ -1579,20 +1251,18 @@ static BOOL test_DeletePrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.handle = handle; r.in.value_name = value_name; - printf("Testing DeletePrinterData\n"); + torture_comment(tctx, "Testing DeletePrinterData\n"); - status = dcerpc_spoolss_DeletePrinterData(p, mem_ctx, &r); + status = dcerpc_spoolss_DeletePrinterData(p, tctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("DeletePrinterData failed - %s\n", nt_errstr(status)); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "DeletePrinterData failed"); - return True; + return true; } -static BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle) +static bool test_SetPrinterData(struct torture_context *tctx, + struct dcerpc_pipe *p, + struct policy_handle *handle) { NTSTATUS status; struct spoolss_SetPrinterData r; @@ -1603,84 +1273,69 @@ static BOOL test_SetPrinterData(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.in.type = SPOOLSS_PRINTER_DATA_TYPE_STRING; r.in.data.string = "dog"; - printf("Testing SetPrinterData\n"); + torture_comment(tctx, "Testing SetPrinterData\n"); - status = dcerpc_spoolss_SetPrinterData(p, mem_ctx, &r); + status = dcerpc_spoolss_SetPrinterData(p, tctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("SetPrinterData failed - %s\n", nt_errstr(status)); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "SetPrinterData failed"); - if (!test_GetPrinterData(p, mem_ctx, handle, value_name)) { - return False; + if (!test_GetPrinterData(tctx, p, handle, value_name)) { + return false; } - if (!test_DeletePrinterData(p, mem_ctx, handle, value_name)) { - return False; + if (!test_DeletePrinterData(tctx, p, handle, value_name)) { + return false; } - return True; + return true; } -static BOOL test_SecondaryClosePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool test_SecondaryClosePrinter(struct torture_context *tctx, + struct dcerpc_pipe *p, struct policy_handle *handle) { NTSTATUS status; struct dcerpc_binding *b; struct dcerpc_pipe *p2; - BOOL ret = True; + bool ret = true; /* only makes sense on SMB */ if (p->conn->transport.transport != NCACN_NP) { return True; } - printf("testing close on secondary pipe\n"); + torture_comment(tctx, "testing close on secondary pipe\n"); - status = dcerpc_parse_binding(mem_ctx, p->conn->binding_string, &b); - if (!NT_STATUS_IS_OK(status)) { - printf("Failed to parse dcerpc binding '%s'\n", p->conn->binding_string); - return False; - } + status = dcerpc_parse_binding(tctx, p->conn->binding_string, &b); + torture_assert_ntstatus_ok(tctx, status, "Failed to parse dcerpc binding"); status = dcerpc_secondary_connection(p, &p2, b); - if (!NT_STATUS_IS_OK(status)) { - printf("Failed to create secondary connection\n"); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "Failed to create secondary connection"); status = dcerpc_bind_auth_none(p2, &ndr_table_spoolss); - if (!NT_STATUS_IS_OK(status)) { - printf("Failed to create bind on secondary connection\n"); - talloc_free(p2); - - return False; - } + torture_assert_ntstatus_ok(tctx, status, "Failed to create bind on secondary connection"); - if (test_ClosePrinter(p2, mem_ctx, handle)) { - printf("ERROR: Allowed close on secondary connection!\n"); - ret = False; + if (test_ClosePrinter(tctx, p2, handle)) { + torture_comment(tctx, "ERROR: Allowed close on secondary connection!\n"); + ret = false; } - if (p2->last_fault_code != DCERPC_FAULT_CONTEXT_MISMATCH) { - printf("Unexpected fault code 0x%x - expected 0x%x\n", - p2->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH); - ret = False; - } + torture_assert_int_equal(tctx, p2->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, + "Unexpected fault code"); talloc_free(p2); - return ret; + return true; } -static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *name) +static bool test_OpenPrinter_badname(struct torture_context *tctx, + struct dcerpc_pipe *p, const char *name) { NTSTATUS status; struct spoolss_OpenPrinter op; struct spoolss_OpenPrinterEx opEx; struct policy_handle handle; - BOOL ret = True; + bool ret = true; op.in.printername = name; op.in.datatype = NULL; @@ -1688,20 +1343,17 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, op.in.access_mask = 0; op.out.handle = &handle; - printf("\nTesting OpenPrinter(%s) with bad name\n", op.in.printername); + torture_comment(tctx, "\nTesting OpenPrinter(%s) with bad name\n", op.in.printername); - status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &op); - if (!NT_STATUS_IS_OK(status)) { - printf("OpenPrinter failed - %s\n", nt_errstr(status)); - ret = False; - } + status = dcerpc_spoolss_OpenPrinter(p, tctx, &op); + torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed"); if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,op.out.result)) { - printf("OpenPrinter(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", + torture_comment(tctx, "OpenPrinter(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", name, win_errstr(op.out.result)); } if (W_ERROR_IS_OK(op.out.result)) { - ret &=test_ClosePrinter(p, mem_ctx, &handle); + ret &=test_ClosePrinter(tctx, p, &handle); } opEx.in.printername = name; @@ -1712,48 +1364,24 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, opEx.in.userlevel.level1 = NULL; opEx.out.handle = &handle; - printf("\nTesting OpenPrinterEx(%s) with bad name\n", opEx.in.printername); + torture_comment(tctx, "Testing OpenPrinterEx(%s) with bad name\n", opEx.in.printername); - status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &opEx); - if (!NT_STATUS_IS_OK(status)) { - printf("OpenPrinter failed - %s\n", nt_errstr(status)); - ret = False; - } + status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &opEx); + torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed"); if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,opEx.out.result)) { - printf("OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", + torture_comment(tctx, "OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", name, win_errstr(opEx.out.result)); } if (W_ERROR_IS_OK(opEx.out.result)) { - ret &=test_ClosePrinter(p, mem_ctx, &handle); + ret &=test_ClosePrinter(tctx, p, &handle); } return ret; } -static BOOL test_OpenPrinter_badnames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) -{ - BOOL ret = True; - char *name; - - ret &= test_OpenPrinter_badname(p, mem_ctx, "__INVALID_PRINTER__"); - ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\__INVALID_HOST__"); - ret &= test_OpenPrinter_badname(p, mem_ctx, ""); - ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\\\"); - ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\\\__INVALID_PRINTER__"); - - name = talloc_asprintf(mem_ctx, "\\\\%s\\", dcerpc_server_name(p)); - ret &= test_OpenPrinter_badname(p, mem_ctx, name); - talloc_free(name); - - name = talloc_asprintf(mem_ctx, "\\\\%s\\__INVALID_PRINTER__", dcerpc_server_name(p)); - ret &= test_OpenPrinter_badname(p, mem_ctx, name); - talloc_free(name); - - return ret; -} - -static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool test_OpenPrinter(struct torture_context *tctx, + struct dcerpc_pipe *p, const char *name) { NTSTATUS status; @@ -1761,42 +1389,37 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle handle; BOOL ret = True; - r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name); + r.in.printername = talloc_asprintf(tctx, "\\\\%s\\%s", dcerpc_server_name(p), name); r.in.datatype = NULL; r.in.devmode_ctr.devmode= NULL; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.out.handle = &handle; - printf("\nTesting OpenPrinter(%s)\n", r.in.printername); + torture_comment(tctx, "Testing OpenPrinter(%s)\n", r.in.printername); - status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &r); + status = dcerpc_spoolss_OpenPrinter(p, tctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("OpenPrinter failed - %s\n", nt_errstr(status)); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("OpenPrinter failed - %s\n", win_errstr(r.out.result)); - return False; - } + torture_assert_werr_ok(tctx, r.out.result, "OpenPrinter failed"); - if (!test_GetPrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_GetPrinter(tctx, p, &handle)) { + ret = false; } - if (!test_SecondaryClosePrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_SecondaryClosePrinter(tctx, p, &handle)) { + ret = false; } - if (!test_ClosePrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_ClosePrinter(tctx, p, &handle)) { + ret = false; } return ret; } -static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool call_OpenPrinterEx(struct torture_context *tctx, + struct dcerpc_pipe *p, const char *name, struct policy_handle *handle) { struct spoolss_OpenPrinterEx r; @@ -1804,10 +1427,10 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, NTSTATUS status; if (name && name[0]) { - r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", + r.in.printername = talloc_asprintf(tctx, "\\\\%s\\%s", dcerpc_server_name(p), name); } else { - r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s", + r.in.printername = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); } @@ -1826,87 +1449,82 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, userlevel1.minor = 3; userlevel1.processor = 4; - printf("Testing OpenPrinterEx(%s)\n", r.in.printername); + torture_comment(tctx, "Testing OpenPrinterEx(%s)\n", r.in.printername); - status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &r); + status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &r); - if (!NT_STATUS_IS_OK(status)) { - printf("OpenPrinterEx failed - %s\n", nt_errstr(status)); - return False; - } + torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed"); - if (!W_ERROR_IS_OK(r.out.result)) { - printf("OpenPrinterEx failed - %s\n", win_errstr(r.out.result)); - return False; - } + torture_assert_werr_ok(tctx, r.out.result, "OpenPrinterEx failed"); - return True; + return true; } -static BOOL test_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, +static bool test_OpenPrinterEx(struct torture_context *tctx, + struct dcerpc_pipe *p, const char *name) { struct policy_handle handle; - BOOL ret = True; + bool ret = true; - if (!call_OpenPrinterEx(p, mem_ctx, name, &handle)) { - return False; + if (!call_OpenPrinterEx(tctx, p, name, &handle)) { + return false; } - if (!test_GetPrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_GetPrinter(tctx, p, &handle)) { + ret = false; } - if (!test_EnumForms(p, mem_ctx, &handle, False)) { - ret = False; + if (!test_EnumForms(tctx, p, &handle, false)) { + ret = false; } - if (!test_AddForm(p, mem_ctx, &handle, False)) { - ret = False; + if (!test_AddForm(tctx, p, &handle, false)) { + ret = false; } - if (!test_EnumPrinterData(p, mem_ctx, &handle)) { - ret = False; + if (!test_EnumPrinterData(tctx, p, &handle)) { + ret = false; } - if (!test_EnumPrinterDataEx(p, mem_ctx, &handle)) { - ret = False; + if (!test_EnumPrinterDataEx(tctx, p, &handle)) { + ret = false; } - if (!test_PausePrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_PausePrinter(tctx, p, &handle)) { + ret = false; } - if (!test_DoPrintTest(p, mem_ctx, &handle)) { - ret = False; + if (!test_DoPrintTest(tctx, p, &handle)) { + ret = false; } - if (!test_ResumePrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_ResumePrinter(tctx, p, &handle)) { + ret = false; } - if (!test_SetPrinterData(p, mem_ctx, &handle)) { - ret = False; + if (!test_SetPrinterData(tctx, p, &handle)) { + ret = false; } - if (!test_SecondaryClosePrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_SecondaryClosePrinter(tctx, p, &handle)) { + ret = false; } - if (!test_ClosePrinter(p, mem_ctx, &handle)) { - ret = False; + if (!test_ClosePrinter(tctx, p, &handle)) { + ret = false; } return ret; } -static BOOL test_EnumPrinters_old(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +static bool test_EnumPrinters_old(struct torture_context *tctx, struct dcerpc_pipe *p) { struct spoolss_EnumPrinters r; NTSTATUS status; uint16_t levels[] = {1, 2, 4, 5}; int i; - BOOL ret = True; + bool ret = true; for (i=0;ip = p; - - ret &= test_OpenPrinter_server(ctx); - - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "W3SvcInstalled"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "BeepEnabled"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "EventLog"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "NetPopup"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "NetPopupToComputer"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "MajorVersion"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "MinorVersion"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DsPresent"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersion"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersionEx"); - ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DNSMachineName"); - ret &= test_EnumForms(ctx->p, ctx, &ctx->server_handle, True); - ret &= test_AddForm(ctx->p, ctx, &ctx->server_handle, True); - ret &= test_EnumPorts(ctx); - ret &= test_GetPrinterDriverDirectory(ctx); - ret &= test_EnumPrinterDrivers(ctx); - ret &= test_EnumMonitors(ctx); - ret &= test_EnumPrintProcessors(ctx); - ret &= test_EnumPrinters(ctx); - ret &= test_OpenPrinter_badnames(p, torture); - ret &= test_AddPort(p, torture); - ret &= test_EnumPorts_old(p, torture); - ret &= test_EnumPrinters_old(p, torture); - ret &= test_EnumPrinterDrivers_old(p, torture); + + ret &= test_OpenPrinter_server(torture, p, ctx); + + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "W3SvcInstalled"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "BeepEnabled"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "EventLog"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "NetPopup"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "NetPopupToComputer"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "MajorVersion"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "MinorVersion"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DefaultSpoolDirectory"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "Architecture"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DsPresent"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "OSVersion"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "OSVersionEx"); + ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DNSMachineName"); + ret &= test_EnumForms(torture, p, &ctx->server_handle, true); + ret &= test_AddForm(torture, p, &ctx->server_handle, true); + ret &= test_EnumPorts(torture, p, ctx); + ret &= test_GetPrinterDriverDirectory(torture, p, ctx); + ret &= test_EnumPrinterDrivers(torture, p, ctx); + ret &= test_EnumMonitors(torture, p, ctx); + ret &= test_EnumPrintProcessors(torture, p, ctx); + ret &= test_EnumPrinters(torture, p, ctx); + ret &= test_OpenPrinter_badname(torture, p, "__INVALID_PRINTER__"); + ret &= test_OpenPrinter_badname(torture, p, "\\\\__INVALID_HOST__"); + ret &= test_OpenPrinter_badname(torture, p, ""); + ret &= test_OpenPrinter_badname(torture, p, "\\\\\\"); + ret &= test_OpenPrinter_badname(torture, p, "\\\\\\__INVALID_PRINTER__"); + ret &= test_OpenPrinter_badname(torture, p, talloc_asprintf(torture, "\\\\%s\\", dcerpc_server_name(p))); + ret &= test_OpenPrinter_badname(torture, p, + talloc_asprintf(torture, "\\\\%s\\__INVALID_PRINTER__", dcerpc_server_name(p))); + + + ret &= test_AddPort(torture, p); + ret &= test_EnumPorts_old(torture, p); + ret &= test_EnumPrinters_old(torture, p); + ret &= test_EnumPrinterDrivers_old(torture, p); + ret &= test_ReplyOpenPrinter(torture, p); return ret; } -- cgit From 2f3551ca7cee59d4d053cceb87abdf1da1b3a1ad Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 1 Oct 2007 18:52:55 +0000 Subject: r25446: Merge some changes I made on the way home from SFO: 2007-09-29 More higher-level passing around of lp_ctx. 2007-09-29 Fix warning. 2007-09-29 Pass loadparm contexts on a higher level. 2007-09-29 Avoid using global loadparm context. (This used to be commit 3468952e771ab31f90b6c374ade01c5550810f42) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 0a0abc5740..278228f731 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -68,7 +68,7 @@ struct test_spoolss_context { #endif #define COMPARE_UINT32(tctx, c, r, e) do {\ - _CHECK_FIELD_SIZE(c, r, e,uint32_t); \ + _CHECK_FIELD_SIZE(c, r, e, uint32_t); \ torture_assert_int_equal(tctx, c.e, r.e, "invalid value"); \ } while(0) -- cgit From 2151cde58014ea2e822c13d2f8a369b45dc19ca8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 6 Oct 2007 22:28:14 +0000 Subject: r25554: Convert last instances of BOOL, True and False to the standard types. (This used to be commit 566aa14139510788548a874e9213d91317f83ca9) --- source4/torture/rpc/spoolss.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 278228f731..9cc42241d2 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -874,12 +874,12 @@ static bool test_AddPort(struct torture_context *tctx, if (!W_ERROR_IS_OK(r.out.result)) { printf("AddPort failed - %s\n", win_errstr(r.out.result)); - return False; + return false; } #endif - return True; + return true; } static bool test_GetJob(struct torture_context *tctx, @@ -987,7 +987,7 @@ static bool test_DoPrintTest(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle) { - bool ret = True; + bool ret = true; NTSTATUS status; struct spoolss_StartDocPrinter s; struct spoolss_DocumentInfo1 info1; @@ -1211,7 +1211,7 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip } while (W_ERROR_IS_OK(r.out.result)); - return True; + return true; } static bool test_EnumPrinterDataEx(struct torture_context *tctx, @@ -1301,7 +1301,7 @@ static bool test_SecondaryClosePrinter(struct torture_context *tctx, /* only makes sense on SMB */ if (p->conn->transport.transport != NCACN_NP) { - return True; + return true; } torture_comment(tctx, "testing close on secondary pipe\n"); @@ -1387,7 +1387,7 @@ static bool test_OpenPrinter(struct torture_context *tctx, NTSTATUS status; struct spoolss_OpenPrinter r; struct policy_handle handle; - BOOL ret = True; + bool ret = true; r.in.printername = talloc_asprintf(tctx, "\\\\%s\\%s", dcerpc_server_name(p), name); r.in.datatype = NULL; @@ -1580,7 +1580,7 @@ static bool test_EnumPrinters_old(struct torture_context *tctx, struct dcerpc_pi } #if 0 -static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, +static bool test_GetPrinterDriver2(struct dcerpc_pipe *p, struct policy_handle *handle, const char *driver_name) { @@ -1600,7 +1600,7 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, status = dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("GetPrinterDriver2 failed - %s\n", nt_errstr(status)); - return False; + return false; } if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { @@ -1611,16 +1611,16 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, if (!NT_STATUS_IS_OK(status)) { printf("GetPrinterDriver2 failed - %s\n", nt_errstr(status)); - return False; + return false; } if (!W_ERROR_IS_OK(r.out.result)) { printf("GetPrinterDriver2 failed - %s\n", win_errstr(r.out.result)); - return False; + return false; } - return True; + return true; } #endif @@ -1706,12 +1706,12 @@ bool torture_rpc_spoolss(struct torture_context *torture) { NTSTATUS status; struct dcerpc_pipe *p; - BOOL ret = True; + bool ret = true; struct test_spoolss_context *ctx; status = torture_rpc_connection(torture, &p, &ndr_table_spoolss); if (!NT_STATUS_IS_OK(status)) { - return False; + return false; } ctx = talloc_zero(torture, struct test_spoolss_context); -- cgit From 1eaefd15cb7ad20165ea4c754535986b642e24f0 Mon Sep 17 00:00:00 2001 From: Kai Blin Date: Mon, 15 Oct 2007 08:35:24 +0200 Subject: r25642: Fix a small typo. (This used to be commit 7416a1d606a315174b782d67463f8cec878d18bb) --- source4/torture/rpc/spoolss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 9cc42241d2..1a145164b7 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1367,7 +1367,7 @@ static bool test_OpenPrinter_badname(struct torture_context *tctx, torture_comment(tctx, "Testing OpenPrinterEx(%s) with bad name\n", opEx.in.printername); status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &opEx); - torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed"); + torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed"); if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,opEx.out.result)) { torture_comment(tctx, "OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", name, win_errstr(opEx.out.result)); -- cgit From e35e41a8f912007a13c40543e4ab1da371b56d1e Mon Sep 17 00:00:00 2001 From: Kai Blin Date: Tue, 20 Nov 2007 09:17:05 +0100 Subject: r26047: spoolss: OpenPrinterEx with an invalid server/printer name returns WERR_INVALID_PARAM This is observed against a Win2k3 DC, and different tothe WERR_INVALID_PRINTER_NAME returned by OpenPrinter. (This used to be commit 7e78dc7cfe695deb2f1f02f03fe00827cded9ce5) --- source4/torture/rpc/spoolss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 1a145164b7..2d343ea1ed 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1368,8 +1368,8 @@ static bool test_OpenPrinter_badname(struct torture_context *tctx, status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &opEx); torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed"); - if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,opEx.out.result)) { - torture_comment(tctx, "OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", + if (!W_ERROR_EQUAL(WERR_INVALID_PARAM,opEx.out.result)) { + torture_comment(tctx, "OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PARAM\n", name, win_errstr(opEx.out.result)); } -- cgit From 9532bced6c4da4063969bd55988674c26eb22e6a Mon Sep 17 00:00:00 2001 From: Kai Blin Date: Tue, 20 Nov 2007 09:33:14 +0100 Subject: r26048: spoolss: Fix test_SecondaryClosePrinter. The test was trying to be too smart. Fixed to not reuse test_ClosePrinter. (This used to be commit 5f688d1fddd1faac523e491ba3de2b453c8b44ca) --- source4/torture/rpc/spoolss.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 2d343ea1ed..23b4aad30b 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1297,7 +1297,7 @@ static bool test_SecondaryClosePrinter(struct torture_context *tctx, NTSTATUS status; struct dcerpc_binding *b; struct dcerpc_pipe *p2; - bool ret = true; + struct spoolss_ClosePrinter cp; /* only makes sense on SMB */ if (p->conn->transport.transport != NCACN_NP) { @@ -1315,10 +1315,12 @@ static bool test_SecondaryClosePrinter(struct torture_context *tctx, status = dcerpc_bind_auth_none(p2, &ndr_table_spoolss); torture_assert_ntstatus_ok(tctx, status, "Failed to create bind on secondary connection"); - if (test_ClosePrinter(tctx, p2, handle)) { - torture_comment(tctx, "ERROR: Allowed close on secondary connection!\n"); - ret = false; - } + cp.in.handle = handle; + cp.out.handle = handle; + + status = dcerpc_spoolss_ClosePrinter(p2, tctx, &cp); + torture_assert_ntstatus_equal(tctx, status, NT_STATUS_NET_WRITE_FAULT, + "ERROR: Allowed close on secondary connection"); torture_assert_int_equal(tctx, p2->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, "Unexpected fault code"); -- cgit From c41944b9f9e6dc5287065b24ab1c1fc20ec36cb4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 13 Feb 2008 10:36:49 +0100 Subject: spoolss.idl: improve idl for EnumPrinterData and not use 'lstring' any more metze (This used to be commit d6cdddbcf37d120cb365bc7f8188858c8776e2e0) --- source4/torture/rpc/spoolss.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'source4/torture/rpc/spoolss.c') diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 23b4aad30b..4a6ff480c4 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1178,16 +1178,23 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip NTSTATUS status; struct spoolss_EnumPrinterData r; + ZERO_STRUCT(r); r.in.handle = handle; r.in.enum_index = 0; do { - uint32_t data_size; - - r.in.value_offered = 0; - data_size = 0; - r.in.data_size = &data_size; - r.out.data_size = &data_size; + uint32_t value_size = 0; + uint32_t data_size = 0; + uint32_t printerdata_type = 0; + DATA_BLOB data = data_blob(NULL,0); + + r.in.value_offered = value_size; + r.out.value_needed = &value_size; + r.in.data_offered = data_size; + r.out.data_needed = &data_size; + + r.out.printerdata_type = &printerdata_type; + r.out.buffer = &data; torture_comment(tctx, "Testing EnumPrinterData\n"); @@ -1195,7 +1202,8 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed"); - r.in.value_offered = r.out.value_needed; + r.in.value_offered = value_size; + r.in.data_offered = data_size; status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r); -- cgit