[SCM] Samba Shared Repository - branch master updated
Günther Deschner
gd at samba.org
Thu Oct 7 10:10:02 MDT 2010
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 <gd at 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 <gd at samba.org>
Autobuild-Date: Thu Oct 7 16:09:14 UTC 2010 on sn-devel-104
commit 12112d545c278e49a0b1377a25bdf8a4598c0f47
Author: Günther Deschner <gd at samba.org>
Date: Sat Oct 2 21:54:32 2010 +0200
s3-rpcclient: add openprinter_ex command.
Guenther
commit f5554fe75c8962987b886468dd1b33f5fbc35fe2
Author: Günther Deschner <gd at samba.org>
Date: Sat Oct 2 21:53:54 2010 +0200
s4-smbtorture: re-arrange openprinterex tests.
Guenther
commit 3b213f6138e21e1c8b2ecac934716f964cf56940
Author: Günther Deschner <gd at 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
More information about the samba-cvs
mailing list