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://&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

Reply via email to