[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Thu Apr 8 08:25:10 MDT 2010


The branch, master has been updated
       via  8d588e9... s3-lanman: use spoolss for api_RDosPrintJobDel().
       via  d5e2b43... s3-lanman: use spoolss for api_WPrintQueueCtrl().
      from  84f3eee... s3-registry: fix fill_in_printer_values() for datatype and printprocessor.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8d588e96d964de5db171cfb666feb1dc2f744aad
Author: Günther Deschner <gd at samba.org>
Date:   Thu Mar 18 19:19:28 2010 +0100

    s3-lanman: use spoolss for api_RDosPrintJobDel().
    
    Guenther

commit d5e2b43176099abe433b07a763d8e4b3180d94eb
Author: Günther Deschner <gd at samba.org>
Date:   Thu Mar 18 18:13:40 2010 +0100

    s3-lanman: use spoolss for api_WPrintQueueCtrl().
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/lanman.c |  151 +++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 129 insertions(+), 22 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c
index c97228f..b9d531f 100644
--- a/source3/smbd/lanman.c
+++ b/source3/smbd/lanman.c
@@ -28,7 +28,9 @@
 #include "includes.h"
 #include "smbd/globals.h"
 #include "../librpc/gen_ndr/cli_samr.h"
+#include "../librpc/gen_ndr/cli_spoolss.h"
 #include "../librpc/gen_ndr/srv_samr.h"
+#include "../librpc/gen_ndr/srv_spoolss.h"
 #include "../lib/util/binsearch.h"
 
 #ifdef CHECK_TYPES
@@ -2965,11 +2967,17 @@ static bool api_RDosPrintJobDel(connection_struct *conn,uint16 vuid,
 	char *str2 = skip_string(param,tpscnt,str1);
 	char *p = skip_string(param,tpscnt,str2);
 	uint32 jobid;
-	int snum;
 	fstring sharename;
 	int errcode;
 	WERROR werr = WERR_OK;
 
+	TALLOC_CTX *mem_ctx = talloc_tos();
+	NTSTATUS status;
+	struct rpc_pipe_client *cli = NULL;
+	struct policy_handle handle;
+	struct spoolss_DevmodeContainer devmode_ctr;
+	enum spoolss_JobControl command;
+
 	if (!str1 || !str2 || !p) {
 		return False;
 	}
@@ -2994,38 +3002,76 @@ static bool api_RDosPrintJobDel(connection_struct *conn,uint16 vuid,
 	}
 	*rdata_len = 0;
 
-	if (!print_job_exists(sharename, jobid)) {
-		errcode = NERR_JobNotFound;
+	ZERO_STRUCT(handle);
+
+	status = rpc_pipe_open_internal(mem_ctx, &ndr_table_spoolss.syntax_id,
+					rpc_spoolss_dispatch, conn->server_info,
+					&cli);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("api_RDosPrintJobDel: could not connect to spoolss: %s\n",
+			  nt_errstr(status)));
+		errcode = W_ERROR_V(ntstatus_to_werror(status));
 		goto out;
 	}
 
-	snum = lp_servicenumber( sharename);
-	if (snum == -1) {
-		errcode = NERR_DestNotFound;
+	ZERO_STRUCT(devmode_ctr);
+
+	status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+					    sharename,
+					    NULL,
+					    devmode_ctr,
+					    SEC_FLAG_MAXIMUM_ALLOWED,
+					    &handle,
+					    &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+	if (!W_ERROR_IS_OK(werr)) {
+		errcode = W_ERROR_V(werr);
 		goto out;
 	}
 
-	errcode = NERR_notsupported;
+	/* FIXME: formerly NERR_JobNotFound was returned if job did not exist
+	 * and NERR_DestNotFound if share did not exist */
+
+	errcode = NERR_Success;
 
 	switch (function) {
-	case 81:		/* delete */ 
-		if (print_job_delete(conn->server_info, snum, jobid, &werr))
-			errcode = NERR_Success;
+	case 81:		/* delete */
+		command = SPOOLSS_JOB_CONTROL_DELETE;
 		break;
 	case 82:		/* pause */
-		if (print_job_pause(conn->server_info, snum, jobid, &werr))
-			errcode = NERR_Success;
+		command = SPOOLSS_JOB_CONTROL_PAUSE;
 		break;
 	case 83:		/* resume */
-		if (print_job_resume(conn->server_info, snum, jobid, &werr))
-			errcode = NERR_Success;
+		command = SPOOLSS_JOB_CONTROL_RESUME;
+		break;
+	default:
+		errcode = NERR_notsupported;
 		break;
 	}
 
-	if (!W_ERROR_IS_OK(werr))
+	status = rpccli_spoolss_SetJob(cli, mem_ctx,
+				       &handle,
+				       jobid,
+				       NULL, /* unique ptr ctr */
+				       command,
+				       &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+	if (!W_ERROR_IS_OK(werr)) {
 		errcode = W_ERROR_V(werr);
+		goto out;
+	}
 
  out:
+	if (is_valid_policy_hnd(&handle)) {
+		rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+	}
+
 	SSVAL(*rparam,0,errcode);	
 	SSVAL(*rparam,2,0);		/* converter word */
 
@@ -3048,8 +3094,16 @@ static bool api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid,
 	char *str2 = skip_string(param,tpscnt,str1);
 	char *QueueName = skip_string(param,tpscnt,str2);
 	int errcode = NERR_notsupported;
-	int snum;
 	WERROR werr = WERR_OK;
+	NTSTATUS status;
+
+	TALLOC_CTX *mem_ctx = talloc_tos();
+	struct rpc_pipe_client *cli = NULL;
+	struct policy_handle handle;
+	struct spoolss_SetPrinterInfoCtr info_ctr;
+	struct spoolss_DevmodeContainer devmode_ctr;
+	struct sec_desc_buf secdesc_ctr;
+	enum spoolss_PrinterControl command;
 
 	if (!str1 || !str2 || !QueueName) {
 		return False;
@@ -3069,31 +3123,84 @@ static bool api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid,
 	if (skip_string(param,tpscnt,QueueName) == NULL) {
 		return False;
 	}
-	snum = print_queue_snum(QueueName);
 
-	if (snum == -1) {
-		errcode = NERR_JobNotFound;
+	ZERO_STRUCT(handle);
+
+	status = rpc_pipe_open_internal(mem_ctx, &ndr_table_spoolss.syntax_id,
+					rpc_spoolss_dispatch, conn->server_info,
+					&cli);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("api_WPrintQueueCtrl: could not connect to spoolss: %s\n",
+			  nt_errstr(status)));
+		errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+
+	ZERO_STRUCT(devmode_ctr);
+
+	status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+					    QueueName,
+					    NULL,
+					    devmode_ctr,
+					    SEC_FLAG_MAXIMUM_ALLOWED,
+					    &handle,
+					    &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+	if (!W_ERROR_IS_OK(werr)) {
+		errcode = W_ERROR_V(werr);
 		goto out;
 	}
 
 	switch (function) {
 	case 74: /* Pause queue */
-		werr = print_queue_pause(conn->server_info, snum);
+		command = SPOOLSS_PRINTER_CONTROL_PAUSE;
 		break;
 	case 75: /* Resume queue */
-		werr = print_queue_resume(conn->server_info, snum);
+		command = SPOOLSS_PRINTER_CONTROL_RESUME;
 		break;
 	case 103: /* Purge */
-		werr = print_queue_purge(conn->server_info, snum);
+		command = SPOOLSS_PRINTER_CONTROL_PURGE;
 		break;
 	default:
 		werr = WERR_NOT_SUPPORTED;
 		break;
 	}
 
+	if (!W_ERROR_IS_OK(werr)) {
+		errcode = W_ERROR_V(werr);
+		goto out;
+	}
+
+	ZERO_STRUCT(info_ctr);
+	ZERO_STRUCT(secdesc_ctr);
+
+	status = rpccli_spoolss_SetPrinter(cli, mem_ctx,
+					   &handle,
+					   &info_ctr,
+					   &devmode_ctr,
+					   &secdesc_ctr,
+					   command,
+					   &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+	if (!W_ERROR_IS_OK(werr)) {
+		errcode = W_ERROR_V(werr);
+		goto out;
+	}
+
 	errcode = W_ERROR_V(werr);
 
  out:
+
+	if (is_valid_policy_hnd(&handle)) {
+		rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+	}
+
 	SSVAL(*rparam,0,errcode);
 	SSVAL(*rparam,2,0);		/* converter word */
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list