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 13:26:11 +0000 (15:26 +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 149e84c3ba4e9d9938efc704fd96f3eb94379144..c511fa2058df69487667353e6456132e69f18efd 100644 (file)
@@ -101,7 +101,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 8f0cd88d0156f9e8abe8c823da771a48c61ab0a8..9f238662b70e9f73d46f8103fe427b1c56edb1c3 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 b925bedaceb6e99e4e435a69fc24615e87a25687..228636ac2683de81a5abce4ead4b6e76e4af29cf 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 9e741c1091ae9a5812002c701d4a54ec405db13c..5ca77f9c864da94f148ddb0caa8079cfa8a9cd3c 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 9ac808ad3a3683d4edae97bbfe2028d6f2eb0934..98b6e89a152441f6ec2d67438e7525096b2adf56 100644 (file)
@@ -3009,6 +3009,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;
@@ -3076,8 +3077,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;