[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://&lt;hostname&gt;[:&lt;portnumber&gt;]
+    <para>The deviceURI is in the format of socket://&lt;hostname&gt;[:&lt;portnumber&gt;]
 	or lpd://&lt;hostname&gt;/&lt;queuename&gt;.</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