Merge branch 'master' of ssh://git.samba.org/data/git/samba into master-devel
authorAndrew Bartlett <abartlet@samba.org>
Tue, 14 Apr 2009 00:55:53 +0000 (10:55 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 14 Apr 2009 00:55:53 +0000 (10:55 +1000)
source3/rpc_server/srv_spoolss_nt.c
source3/rpcclient/cmd_spoolss.c
source4/torture/rpc/spoolss.c
source4/torture/rpc/spoolss_notify.c

index 3edfca9400d0ec439b3423576d7450099ba9308a..effbb92266688530d02f02bfef928851d3f57062 100644 (file)
@@ -4836,7 +4836,7 @@ static WERROR fill_printer_driver_info3(TALLOC_CTX *mem_ctx,
        } else {
                r->help_file    = talloc_strdup(mem_ctx, "");
        }
-       W_ERROR_HAVE_NO_MEMORY(r->config_file);
+       W_ERROR_HAVE_NO_MEMORY(r->help_file);
 
        r->monitor_name         = talloc_strdup(mem_ctx, driver->info_3->monitorname);
        W_ERROR_HAVE_NO_MEMORY(r->monitor_name);
index c9c457b364523ecd6b4b7e837891d2280abfdd26..4bcaa291e186b9d5d881ebbc66841cb108fb4f5d 100644 (file)
@@ -2449,6 +2449,60 @@ done:
        return result;
 }
 
+/****************************************************************************
+****************************************************************************/
+
+static WERROR cmd_spoolss_set_job(struct rpc_pipe_client *cli,
+                                 TALLOC_CTX *mem_ctx, int argc,
+                                 const char **argv)
+{
+       WERROR result;
+       NTSTATUS status;
+       const char *printername;
+       struct policy_handle hnd;
+       uint32_t job_id;
+       enum spoolss_JobControl command;
+
+       if (argc != 4) {
+               printf("Usage: %s printername job_id command\n", argv[0]);
+               return WERR_OK;
+       }
+
+       job_id = atoi(argv[2]);
+       command = atoi(argv[3]);
+
+       /* Open printer handle */
+
+       RPCCLIENT_PRINTERNAME(printername, cli, argv[1]);
+
+       result = rpccli_spoolss_openprinter_ex(cli, mem_ctx,
+                                              printername,
+                                              SEC_FLAG_MAXIMUM_ALLOWED,
+                                              &hnd);
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       /* Set Job */
+
+       status = rpccli_spoolss_SetJob(cli, mem_ctx,
+                                      &hnd,
+                                      job_id,
+                                      NULL,
+                                      command,
+                                      &result);
+
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+done:
+       if (is_valid_policy_hnd(&hnd)) {
+               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+       }
+
+       return result;
+}
 
 /****************************************************************************
 ****************************************************************************/
@@ -3136,6 +3190,7 @@ struct cmd_set spoolss_commands[] = {
        { "enumkey",            RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_printerkey,    &ndr_table_spoolss.syntax_id, NULL, "Enumerate printer keys",              "" },
        { "enumjobs",           RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_jobs,          &ndr_table_spoolss.syntax_id, NULL, "Enumerate print jobs",                "" },
        { "getjob",             RPC_RTYPE_WERROR, NULL, cmd_spoolss_get_job,            &ndr_table_spoolss.syntax_id, NULL, "Get print job",                       "" },
+       { "setjob",             RPC_RTYPE_WERROR, NULL, cmd_spoolss_set_job,            &ndr_table_spoolss.syntax_id, NULL, "Set print job",                       "" },
        { "enumports",          RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_ports,         &ndr_table_spoolss.syntax_id, NULL, "Enumerate printer ports",             "" },
        { "enumdrivers",        RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_drivers,       &ndr_table_spoolss.syntax_id, NULL, "Enumerate installed printer drivers", "" },
        { "enumprinters",       RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_printers,      &ndr_table_spoolss.syntax_id, NULL, "Enumerate printers",                  "" },
index f2a503b6fdf9b3a0190ff8ec7fb3598e5c5a9b16..b1889704a73901364128c2b818a23cede2e30030 100644 (file)
@@ -1122,6 +1122,7 @@ static bool test_AddJob(struct torture_context *tctx,
        r.in.handle = handle;
        r.in.offered = 0;
        r.out.needed = &needed;
+       r.in.buffer = r.out.buffer = NULL;
 
        torture_comment(tctx, "Testing AddJob\n");
 
@@ -1381,6 +1382,7 @@ static bool test_GetPrinterDataEx(struct torture_context *tctx,
        r.in.offered = 0;
        r.out.type = &type;
        r.out.needed = &needed;
+       r.out.buffer = NULL;
 
        torture_comment(tctx, "Testing GetPrinterDataEx\n");
 
@@ -1658,8 +1660,10 @@ static bool test_OpenPrinter(struct torture_context *tctx,
                ret = false;
        }
 
-       if (!test_SecondaryClosePrinter(tctx, p, &handle)) {
-               ret = false;
+       if (!torture_setting_bool(tctx, "samba3", false)) {
+               if (!test_SecondaryClosePrinter(tctx, p, &handle)) {
+                       ret = false;
+               }
        }
 
        if (!test_ClosePrinter(tctx, p, &handle)) {
@@ -1758,8 +1762,10 @@ static bool test_OpenPrinterEx(struct torture_context *tctx,
                ret = false;
        }
 
-       if (!test_SecondaryClosePrinter(tctx, p, &handle)) {
-               ret = false;
+       if (!torture_setting_bool(tctx, "samba3", false)) {
+               if (!test_SecondaryClosePrinter(tctx, p, &handle)) {
+                       ret = false;
+               }
        }
 
        if (!test_ClosePrinter(tctx, p, &handle)) {
@@ -1941,41 +1947,6 @@ static bool test_EnumPrinterDrivers_old(struct torture_context *tctx,
        return true;
 }
 
-/** Test that makes sure that calling ReplyOpenPrinter()
- * on Samba 4 will cause an irpc broadcast call.
- */
-static bool test_ReplyOpenPrinter(struct torture_context *tctx, 
-                                 struct dcerpc_pipe *pipe)
-{
-       struct spoolss_ReplyOpenPrinter r;
-       struct spoolss_ReplyClosePrinter s;
-       struct policy_handle h;
-
-       r.in.server_name = "earth";
-       r.in.printer_local = 2;
-       r.in.type = REG_DWORD;
-       r.in.bufsize = 0;
-       r.in.buffer = NULL;
-       r.out.handle = &h;
-
-       torture_assert_ntstatus_ok(tctx, 
-                       dcerpc_spoolss_ReplyOpenPrinter(pipe, tctx, &r),
-                       "spoolss_ReplyOpenPrinter call failed");
-
-       torture_assert_werr_ok(tctx, r.out.result, "error return code");
-
-       s.in.handle = &h;
-       s.out.handle = &h;
-
-       torture_assert_ntstatus_ok(tctx,
-                       dcerpc_spoolss_ReplyClosePrinter(pipe, tctx, &s),
-                       "spoolss_ReplyClosePrinter call failed");
-
-       torture_assert_werr_ok(tctx, r.out.result, "error return code");
-
-       return true;
-}
-
 bool torture_rpc_spoolss(struct torture_context *torture)
 {
        NTSTATUS status;
@@ -2029,7 +2000,6 @@ bool torture_rpc_spoolss(struct torture_context *torture)
        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;
 }
index b7f2d3c4101b64b9262b947f10811082d8f586f0..a8a0ca5df63de26f97e4f1675ab339ef44f6e560 100644 (file)
@@ -289,6 +289,41 @@ static bool test_RFFPCNEx(struct torture_context *tctx,
        return true;
 }
 
+/** Test that makes sure that calling ReplyOpenPrinter()
+ * on Samba 4 will cause an irpc broadcast call.
+ */
+static bool test_ReplyOpenPrinter(struct torture_context *tctx,
+                                 struct dcerpc_pipe *pipe)
+{
+       struct spoolss_ReplyOpenPrinter r;
+       struct spoolss_ReplyClosePrinter s;
+       struct policy_handle h;
+
+       r.in.server_name = "earth";
+       r.in.printer_local = 2;
+       r.in.type = REG_DWORD;
+       r.in.bufsize = 0;
+       r.in.buffer = NULL;
+       r.out.handle = &h;
+
+       torture_assert_ntstatus_ok(tctx,
+                       dcerpc_spoolss_ReplyOpenPrinter(pipe, tctx, &r),
+                       "spoolss_ReplyOpenPrinter call failed");
+
+       torture_assert_werr_ok(tctx, r.out.result, "error return code");
+
+       s.in.handle = &h;
+       s.out.handle = &h;
+
+       torture_assert_ntstatus_ok(tctx,
+                       dcerpc_spoolss_ReplyClosePrinter(pipe, tctx, &s),
+                       "spoolss_ReplyClosePrinter call failed");
+
+       torture_assert_werr_ok(tctx, r.out.result, "error return code");
+
+       return true;
+}
+
 struct torture_suite *torture_rpc_spoolss_notify(TALLOC_CTX *mem_ctx)
 {
        struct torture_suite *suite = torture_suite_create(mem_ctx, "SPOOLSS-NOTIFY");
@@ -297,6 +332,7 @@ struct torture_suite *torture_rpc_spoolss_notify(TALLOC_CTX *mem_ctx)
                                                        "notify", &ndr_table_spoolss);
 
        torture_rpc_tcase_add_test(tcase, "testRFFPCNEx", test_RFFPCNEx);
+       torture_rpc_tcase_add_test(tcase, "testReplyOpenPrinter", test_ReplyOpenPrinter);
        
        return suite;
 }