s3:printing: use dcerpc_spoolss_X() functions
[kai/samba.git] / source3 / printing / printspoolss.c
index 8426b84fec501a4ef5a839a7d579e4e0f5f4692e..9b06ece307e35be3a336224cee9688f33d02fbeb 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "includes.h"
 #include "printing.h"
-#include "../librpc/gen_ndr/cli_spoolss.h"
+#include "../librpc/gen_ndr/ndr_spoolss_c.h"
 #include "rpc_server/rpc_ncacn_np.h"
 #include "smbd/globals.h"
 #include "../libcli/security/security.h"
@@ -43,7 +43,7 @@ NTSTATUS print_spool_open(files_struct *fsp,
        NTSTATUS status;
        TALLOC_CTX *tmp_ctx;
        struct print_file_data *pf;
-       struct rpc_pipe_client *cli;
+       struct dcerpc_binding_handle *b = NULL;
        struct spoolss_DevmodeContainer devmode_ctr;
        union spoolss_DocumentInfo info;
        int fd = -1;
@@ -132,11 +132,11 @@ NTSTATUS print_spool_open(files_struct *fsp,
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
        }
-       cli = fsp->conn->spoolss_pipe;
+       b = fsp->conn->spoolss_pipe->binding_handle;
 
        ZERO_STRUCT(devmode_ctr);
 
-       status = rpccli_spoolss_OpenPrinter(cli, pf, pf->svcname,
+       status = dcerpc_spoolss_OpenPrinter(b, pf, pf->svcname,
                                            "RAW", devmode_ctr,
                                            SEC_FLAG_MAXIMUM_ALLOWED,
                                            &pf->handle, &werr);
@@ -157,7 +157,7 @@ NTSTATUS print_spool_open(files_struct *fsp,
        info.info1->output_file = pf->filename;
        info.info1->datatype = "RAW";
 
-       status = rpccli_spoolss_StartDocPrinter(cli, tmp_ctx, &pf->handle,
+       status = dcerpc_spoolss_StartDocPrinter(b, tmp_ctx, &pf->handle,
                                                1, info, &pf->jobid, &werr);
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
@@ -208,7 +208,9 @@ done:
        if (!NT_STATUS_IS_OK(status)) {
                if (fd != -1) {
                        close(fd);
-                       unlink(fsp->print_file->filename);
+                       if (fsp->print_file) {
+                               unlink(fsp->print_file->filename);
+                       }
                }
                /* We need to delete the job from spoolss too */
                if (pf->jobid) {
@@ -270,9 +272,9 @@ int print_spool_write(files_struct *fsp,
 
 void print_spool_end(files_struct *fsp, enum file_close_type close_type)
 {
-       struct rpc_pipe_client *cli;
        NTSTATUS status;
        WERROR werr;
+       struct dcerpc_binding_handle *b = NULL;
 
        status = rpc_pipe_open_interface(fsp->conn,
                                         &ndr_table_spoolss.syntax_id,
@@ -286,13 +288,13 @@ void print_spool_end(files_struct *fsp, enum file_close_type close_type)
                          nt_errstr(status)));
                return;
        }
-       cli = fsp->conn->spoolss_pipe;
+       b = fsp->conn->spoolss_pipe->binding_handle;
 
        switch (close_type) {
        case NORMAL_CLOSE:
        case SHUTDOWN_CLOSE:
                /* this also automatically calls spoolss_EndDocPrinter */
-               status = rpccli_spoolss_ClosePrinter(cli, fsp->print_file,
+               status = dcerpc_spoolss_ClosePrinter(b, fsp->print_file,
                                                &fsp->print_file->handle,
                                                &werr);
                if (!NT_STATUS_IS_OK(status) ||
@@ -311,9 +313,9 @@ void print_spool_end(files_struct *fsp, enum file_close_type close_type)
 void print_spool_terminate(struct connection_struct *conn,
                           struct print_file_data *print_file)
 {
-       struct rpc_pipe_client *cli;
        NTSTATUS status;
        WERROR werr;
+       struct dcerpc_binding_handle *b = NULL;
 
        rap_jobid_delete(print_file->svcname, print_file->jobid);
 
@@ -329,9 +331,9 @@ void print_spool_terminate(struct connection_struct *conn,
                          nt_errstr(status)));
                return;
        }
-       cli = conn->spoolss_pipe;
+       b = conn->spoolss_pipe->binding_handle;
 
-       status = rpccli_spoolss_SetJob(cli, print_file,
+       status = dcerpc_spoolss_SetJob(b, print_file,
                                        &print_file->handle,
                                        print_file->jobid,
                                        NULL, SPOOLSS_JOB_CONTROL_DELETE,
@@ -342,7 +344,7 @@ void print_spool_terminate(struct connection_struct *conn,
                          print_file->jobid, nt_errstr(status)));
                return;
        }
-       status = rpccli_spoolss_ClosePrinter(cli, print_file,
+       status = dcerpc_spoolss_ClosePrinter(b, print_file,
                                             &print_file->handle,
                                             &werr);
        if (!NT_STATUS_IS_OK(status) ||