[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