The branch, master has been updated via d8c86a7 s3-spoolss: make it possible to have and announce a [prnproc$] share on the printserver. via 12112d5 s3-rpcclient: add openprinter_ex command. via f5554fe s4-smbtorture: re-arrange openprinterex tests. via 3b213f6 s3-docs: fix typo in "add port command" smb.conf manpage. from b7683a2 samr: for correctness, rename samr_RidTypeArray to samr_RidAttrArray.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit d8c86a7f773877af50508cf88c383c04f23d961b Author: Günther Deschner <g...@samba.org> Date: Sat Oct 2 22:17:46 2010 +0200 s3-spoolss: make it possible to have and announce a [prnproc$] share on the printserver. Guenther Autobuild-User: Günther Deschner <g...@samba.org> Autobuild-Date: Thu Oct 7 16:09:14 UTC 2010 on sn-devel-104 commit 12112d545c278e49a0b1377a25bdf8a4598c0f47 Author: Günther Deschner <g...@samba.org> Date: Sat Oct 2 21:54:32 2010 +0200 s3-rpcclient: add openprinter_ex command. Guenther commit f5554fe75c8962987b886468dd1b33f5fbc35fe2 Author: Günther Deschner <g...@samba.org> Date: Sat Oct 2 21:53:54 2010 +0200 s4-smbtorture: re-arrange openprinterex tests. Guenther commit 3b213f6138e21e1c8b2ecac934716f964cf56940 Author: Günther Deschner <g...@samba.org> Date: Sun Oct 3 06:55:34 2010 +0200 s3-docs: fix typo in "add port command" smb.conf manpage. Guenther ----------------------------------------------------------------------- Summary of changes: docs-xml/smbdotconf/printing/addportcommand.xml | 2 +- source3/rpc_server/srv_spoolss_nt.c | 14 ++++- source3/rpcclient/cmd_spoolss.c | 48 ++++++++++++++++- source4/torture/rpc/spoolss.c | 67 ++++++++++++++++------- 4 files changed, 106 insertions(+), 25 deletions(-) Changeset truncated at 500 lines: diff --git a/docs-xml/smbdotconf/printing/addportcommand.xml b/docs-xml/smbdotconf/printing/addportcommand.xml index 294ea8e..17c899e 100644 --- a/docs-xml/smbdotconf/printing/addportcommand.xml +++ b/docs-xml/smbdotconf/printing/addportcommand.xml @@ -15,7 +15,7 @@ <listitem><para><parameter moreinfo="none">device URI</parameter></para></listitem> </itemizedlist> - <para>The deviceURI is in the for of socket://<hostname>[:<portnumber>] + <para>The deviceURI is in the format of socket://<hostname>[:<portnumber>] or lpd://<hostname>/<queuename>.</para> </description> diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 4de2cdb..c05ba66 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -9606,6 +9606,9 @@ WERROR _spoolss_GetPrintProcessorDirectory(struct pipes_struct *p, struct spoolss_GetPrintProcessorDirectory *r) { WERROR result; + fstring prnproc_share; + bool prnproc_share_exists = false; + int snum; /* that's an [in out] buffer */ @@ -9622,10 +9625,17 @@ WERROR _spoolss_GetPrintProcessorDirectory(struct pipes_struct *p, /* We always should reply with a local print processor directory so that * users are not forced to have a [prnproc$] share on the Samba spoolss - * server - Guenther */ + * server, if users decide to do so, lets announce it though - Guenther */ + + fstrcpy(prnproc_share, "prnproc$"); + + snum = find_service(prnproc_share); + if (snum != -1) { + prnproc_share_exists = true; + } result = getprintprocessordirectory_level_1(p->mem_ctx, - NULL, /* r->in.server */ + prnproc_share_exists ? r->in.server : NULL, r->in.environment, &r->out.info->info1); if (!W_ERROR_IS_OK(result)) { diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c index 0cfceec..26112b9 100644 --- a/source3/rpcclient/cmd_spoolss.c +++ b/source3/rpcclient/cmd_spoolss.c @@ -136,6 +136,51 @@ static WERROR cmd_spoolss_open_printer_ex(struct rpc_pipe_client *cli, return werror; } +/**************************************************************************** +****************************************************************************/ + +static WERROR cmd_spoolss_open_printer(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + int argc, const char **argv) +{ + WERROR werror; + struct policy_handle hnd; + uint32_t access_mask = PRINTER_ALL_ACCESS; + NTSTATUS status; + struct spoolss_DevmodeContainer devmode_ctr; + + ZERO_STRUCT(devmode_ctr); + + if (argc < 2) { + printf("Usage: %s <printername> [access_mask]\n", argv[0]); + return WERR_OK; + } + + if (argc >= 3) { + sscanf(argv[2], "%x", &access_mask); + } + + /* Open the printer handle */ + + status = rpccli_spoolss_OpenPrinter(cli, mem_ctx, + argv[1], + NULL, + devmode_ctr, + access_mask, + &hnd, + &werror); + if (W_ERROR_IS_OK(werror)) { + printf("Printer %s opened successfully\n", argv[1]); + rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, &werror); + + if (!W_ERROR_IS_OK(werror)) { + printf("Error closing printer handle! (%s)\n", + get_dos_error_msg(werror)); + } + } + + return werror; +} /**************************************************************************** ****************************************************************************/ @@ -3557,7 +3602,8 @@ struct cmd_set spoolss_commands[] = { { "getdriver", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getdriver, &ndr_table_spoolss.syntax_id, NULL, "Get print driver information", "" }, { "getdriverdir", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getdriverdir, &ndr_table_spoolss.syntax_id, NULL, "Get print driver upload directory", "" }, { "getprinter", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getprinter, &ndr_table_spoolss.syntax_id, NULL, "Get printer info", "" }, - { "openprinter", RPC_RTYPE_WERROR, NULL, cmd_spoolss_open_printer_ex, &ndr_table_spoolss.syntax_id, NULL, "Open printer handle", "" }, + { "openprinter", RPC_RTYPE_WERROR, NULL, cmd_spoolss_open_printer, &ndr_table_spoolss.syntax_id, NULL, "Open printer handle", "" }, + { "openprinter_ex", RPC_RTYPE_WERROR, NULL, cmd_spoolss_open_printer_ex, &ndr_table_spoolss.syntax_id, NULL, "Open printer handle", "" }, { "setdriver", RPC_RTYPE_WERROR, NULL, cmd_spoolss_setdriver, &ndr_table_spoolss.syntax_id, NULL, "Set printer driver", "" }, { "getprintprocdir", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getprintprocdir, &ndr_table_spoolss.syntax_id, NULL, "Get print processor directory", "" }, { "addform", RPC_RTYPE_WERROR, NULL, cmd_spoolss_addform, &ndr_table_spoolss.syntax_id, NULL, "Add form", "" }, diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 99f2376..de4ca83 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -5738,6 +5738,39 @@ static bool test_OpenPrinter(struct torture_context *tctx, return ret; } +static bool test_OpenPrinterEx(struct torture_context *tctx, + struct dcerpc_binding_handle *b, + const char *printername, + const char *datatype, + struct spoolss_DeviceMode *devmode, + uint32_t access_mask, + uint32_t level, + union spoolss_UserLevel *userlevel, + struct policy_handle *handle, + WERROR expected_result) +{ + struct spoolss_OpenPrinterEx r; + + r.in.printername = printername; + r.in.datatype = datatype; + r.in.devmode_ctr.devmode= devmode; + r.in.access_mask = access_mask; + r.in.level = level; + r.in.userlevel = *userlevel; + r.out.handle = handle; + + torture_comment(tctx, "Testing OpenPrinterEx(%s)\n", r.in.printername); + + torture_assert_ntstatus_ok(tctx, + dcerpc_spoolss_OpenPrinterEx_r(b, tctx, &r), + "OpenPrinterEx failed"); + + torture_assert_werr_equal(tctx, r.out.result, expected_result, + "OpenPrinterEx failed"); + + return true; +} + static bool call_OpenPrinterEx(struct torture_context *tctx, struct dcerpc_pipe *p, const char *name, @@ -5745,18 +5778,11 @@ static bool call_OpenPrinterEx(struct torture_context *tctx, struct policy_handle *handle) { struct spoolss_OpenPrinterEx r; + union spoolss_UserLevel userlevel; struct spoolss_UserLevel1 userlevel1; NTSTATUS status; struct dcerpc_binding_handle *b = p->binding_handle; - r.in.printername = name; - r.in.datatype = NULL; - r.in.devmode_ctr.devmode= devmode; - r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; - r.in.level = 1; - r.in.userlevel.level1 = &userlevel1; - r.out.handle = handle; - userlevel1.size = 1234; userlevel1.client = "hello"; userlevel1.user = "spottyfoot!"; @@ -5765,15 +5791,14 @@ static bool call_OpenPrinterEx(struct torture_context *tctx, userlevel1.minor = 3; userlevel1.processor = 4; - torture_comment(tctx, "Testing OpenPrinterEx(%s)\n", r.in.printername); + userlevel.level1 = &userlevel1; - status = dcerpc_spoolss_OpenPrinterEx_r(b, tctx, &r); - - torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed"); - - torture_assert_werr_ok(tctx, r.out.result, "OpenPrinterEx failed"); - - return true; + return test_OpenPrinterEx(tctx, b, name, NULL, devmode, + SEC_FLAG_MAXIMUM_ALLOWED, + 1, + &userlevel, + handle, + WERR_OK); } static bool test_printer_rename(struct torture_context *tctx, @@ -5872,10 +5897,10 @@ static bool test_printer_rename(struct torture_context *tctx, } -static bool test_OpenPrinterEx(struct torture_context *tctx, - struct dcerpc_pipe *p, - const char *name, - const char *environment) +static bool test_existing_printer_openprinterex(struct torture_context *tctx, + struct dcerpc_pipe *p, + const char *name, + const char *environment) { struct policy_handle handle; bool ret = true; @@ -6029,7 +6054,7 @@ static bool test_EnumPrinters_old(struct torture_context *tctx, if (!test_OpenPrinter(tctx, p, name, ctx->environment, false)) { ret = false; } - if (!test_OpenPrinterEx(tctx, p, name, ctx->environment)) { + if (!test_existing_printer_openprinterex(tctx, p, name, ctx->environment)) { ret = false; } } -- Samba Shared Repository