s3-printing: pass lpq command to job_submit
authorDavid Disseldorp <ddiss@samba.org>
Wed, 8 Feb 2012 17:47:11 +0000 (18:47 +0100)
committerDavid Disseldorp <ddiss@samba.org>
Mon, 25 Jun 2012 12:42:16 +0000 (14:42 +0200)
Currently the generic print backend does not fill the printing backend
job identifier (sysjob) on submission of a new job. The sysjob
identifier is required to correctly map jobs in the printer queue to
corresponding spoolss print jobs.

Passing the lpq command to job_submit allows the generic print backend
to check the printer queue for the new job following submission. This
behaviour will come in a later commit.

source3/include/printing.h
source3/printing/print_cups.c
source3/printing/print_generic.c
source3/printing/print_iprint.c
source3/printing/printing.c

index 222da8c478102ebdbc82399d6b23635ee4aea855..5d0672cc36f8305775f45f368c1803dcc477b193 100644 (file)
@@ -102,7 +102,9 @@ struct printif
   int (*job_delete)(const char *sharename, const char *lprm_command, struct printjob *pjob);
   int (*job_pause)(int snum, struct printjob *pjob);
   int (*job_resume)(int snum, struct printjob *pjob);
-  int (*job_submit)(int snum, struct printjob *pjob);
+  int (*job_submit)(int snum, struct printjob *pjob,
+                   enum printing_types printing_type,
+                   char *lpq_command);
 };
 
 extern struct printif  generic_printif;
index 88f143c0c7381788513046b4db775286ff2e17cf..b5c7b0d4ecac498acd16b5d6aaa87c93ef0e0bf8 100644 (file)
@@ -852,7 +852,9 @@ static int cups_job_resume(int snum, struct printjob *pjob)
  * 'cups_job_submit()' - Submit a job for printing.
  */
 
-static int cups_job_submit(int snum, struct printjob *pjob)
+static int cups_job_submit(int snum, struct printjob *pjob,
+                          enum printing_types printing_type,
+                          char *lpq_cmd)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        int             ret = 1;                /* Return value */
index 14f4c6dbe79e23ff5c2e00f95435ca9b3c7c243a..3211705b8ec28c19b8e479f54348e2dfeb581917 100644 (file)
@@ -142,7 +142,9 @@ static int generic_job_resume(int snum, struct printjob *pjob)
  Submit a file for printing - called from print_job_end()
 ****************************************************************************/
 
-static int generic_job_submit(int snum, struct printjob *pjob)
+static int generic_job_submit(int snum, struct printjob *pjob,
+                             enum printing_types printing_type,
+                             char *lpq_cmd)
 {
        int ret = -1;
        char *current_directory = NULL;
index 78d5098fdfb9f03567e68fbf43f3689c99245f57..ea0c93778bcadedf1363efdf9bb4a555671205ee 100644 (file)
@@ -722,7 +722,9 @@ static int iprint_job_resume(int snum, struct printjob *pjob)
  * 'iprint_job_submit()' - Submit a job for printing.
  */
 
-static int iprint_job_submit(int snum, struct printjob *pjob)
+static int iprint_job_submit(int snum, struct printjob *pjob,
+                            enum printing_types printing_type,
+                            char *lpq_cmd)
 {
        int             ret = 1;                /* Return value */
        http_t          *http = NULL;           /* HTTP connection to server */
index 4d0178f1852ac9540a6584fba81aa438f22ea2fa..1e0d61df329ecf1d3214319842700130c1590f25 100644 (file)
@@ -2903,6 +2903,7 @@ NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum,
        SMB_STRUCT_STAT sbuf;
        struct printif *current_printif = get_printer_fns(snum);
        NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
+       char *lpq_cmd;
        TALLOC_CTX *tmp_ctx = talloc_new(msg_ctx);
        if (tmp_ctx == NULL) {
                return NT_STATUS_NO_MEMORY;
@@ -2970,8 +2971,31 @@ NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum,
                return NT_STATUS_OK;
        }
 
-       ret = (*(current_printif->job_submit))(snum, pjob);
+       /* don't strip out characters like '$' from the printername */
+       lpq_cmd = talloc_string_sub2(tmp_ctx,
+                                    lp_lpqcommand(snum),
+                                    "%p",
+                                    lp_printername(snum),
+                                    false, false, false);
+       if (lpq_cmd == NULL) {
+               status = NT_STATUS_PRINT_CANCELLED;
+               goto fail;
+       }
+       lpq_cmd = talloc_sub_advanced(tmp_ctx,
+                                     lp_servicename(snum),
+                                     current_user_info.unix_name,
+                                     "",
+                                     current_user.ut.gid,
+                                     get_current_username(),
+                                     current_user_info.domain,
+                                     lpq_cmd);
+       if (lpq_cmd == NULL) {
+               status = NT_STATUS_PRINT_CANCELLED;
+               goto fail;
+       }
 
+       ret = (*(current_printif->job_submit))(snum, pjob,
+                                              current_printif->type, lpq_cmd);
        if (ret) {
                status = NT_STATUS_PRINT_CANCELLED;
                goto fail;