diff options
author | David Disseldorp <ddiss@samba.org> | 2012-02-09 12:08:27 +0100 |
---|---|---|
committer | David Disseldorp <ddiss@samba.org> | 2012-06-26 16:10:39 +0200 |
commit | 1c2f1543230b2a016b026e1f3a03a52f0d9d76d7 (patch) | |
tree | a90d0fec1a33c2453578dc80b4f5b38ce02abc00 | |
parent | c29773d89036153a122f577ff9fb2a789e7f156f (diff) | |
download | samba-1c2f1543230b2a016b026e1f3a03a52f0d9d76d7.tar.gz samba-1c2f1543230b2a016b026e1f3a03a52f0d9d76d7.tar.bz2 samba-1c2f1543230b2a016b026e1f3a03a52f0d9d76d7.zip |
s3-printing: fill print_generic sysjob id on job submission
Change the generic print backend to fill the printing backend job
identifier (sysjob) on submission of a new job.
This is needed to ensure correct mapping of spoolss jobs and entries in
the backend print queue.
This and the last 13 commits attempt to address bug 8719.
-rw-r--r-- | source3/printing/print_generic.c | 145 |
1 files changed, 88 insertions, 57 deletions
diff --git a/source3/printing/print_generic.c b/source3/printing/print_generic.c index 3211705b8e..8f557376d7 100644 --- a/source3/printing/print_generic.c +++ b/source3/printing/print_generic.c @@ -139,6 +139,62 @@ static int generic_job_resume(int snum, struct printjob *pjob) } /**************************************************************************** +get the current list of queued jobs +****************************************************************************/ +static int generic_queue_get(const char *printer_name, + enum printing_types printing_type, + char *lpq_command, + print_queue_struct **q, + print_status_struct *status) +{ + char **qlines; + int fd; + int numlines, i, qcount; + print_queue_struct *queue = NULL; + + /* never do substitution when running the 'lpq command' since we can't + get it rigt when using the background update daemon. Make the caller + do it before passing off the command string to us here. */ + + print_run_command(-1, printer_name, False, lpq_command, &fd, NULL); + + if (fd == -1) { + DEBUG(5,("generic_queue_get: Can't read print queue status for printer %s\n", + printer_name )); + return 0; + } + + numlines = 0; + qlines = fd_lines_load(fd, &numlines,0,NULL); + close(fd); + + /* turn the lpq output into a series of job structures */ + qcount = 0; + ZERO_STRUCTP(status); + if (numlines && qlines) { + queue = SMB_MALLOC_ARRAY(print_queue_struct, numlines+1); + if (!queue) { + TALLOC_FREE(qlines); + *q = NULL; + return 0; + } + memset(queue, '\0', sizeof(print_queue_struct)*(numlines+1)); + + for (i=0; i<numlines; i++) { + /* parse the line */ + if (parse_lpq_entry(printing_type,qlines[i], + &queue[qcount],status,qcount==0)) { + qcount++; + } + } + } + + TALLOC_FREE(qlines); + *q = queue; + return qcount; +} + +/**************************************************************************** Submit a file for printing - called from print_job_end() ****************************************************************************/ @@ -154,6 +210,8 @@ static int generic_job_submit(int snum, struct printjob *pjob, char *jobname = NULL; TALLOC_CTX *ctx = talloc_tos(); fstring job_page_count, job_size; + print_queue_struct *q; + print_status_struct status; /* we print from the directory path to give the best chance of parsing the lpq output */ @@ -204,6 +262,36 @@ static int generic_job_submit(int snum, struct printjob *pjob, "%z", job_size, "%c", job_page_count, NULL); + if (ret != 0) { + ret = -1; + goto out; + } + + /* + * check the queue for the newly submitted job, this allows us to + * determine the backend job identifier (sysjob). + */ + pjob->sysjob = -1; + ret = generic_queue_get(lp_printername(snum), printing_type, lpq_cmd, + &q, &status); + if (ret > 0) { + int i; + for (i = 0; i < ret; i++) { + if (strcmp(q[i].fs_file, p) == 0) { + pjob->sysjob = q[i].sysjob; + DEBUG(5, ("new job %u (%s) matches sysjob %d\n", + pjob->jobid, jobname, pjob->sysjob)); + break; + } + } + SAFE_FREE(q); + ret = 0; + } + if (pjob->sysjob == -1) { + DEBUG(0, ("failed to get sysjob for job %u (%s), tracking as " + "Unix job\n", pjob->jobid, jobname)); + } + out: @@ -214,63 +302,6 @@ static int generic_job_submit(int snum, struct printjob *pjob, return ret; } - -/**************************************************************************** -get the current list of queued jobs -****************************************************************************/ -static int generic_queue_get(const char *printer_name, - enum printing_types printing_type, - char *lpq_command, - print_queue_struct **q, - print_status_struct *status) -{ - char **qlines; - int fd; - int numlines, i, qcount; - print_queue_struct *queue = NULL; - - /* never do substitution when running the 'lpq command' since we can't - get it rigt when using the background update daemon. Make the caller - do it before passing off the command string to us here. */ - - print_run_command(-1, printer_name, False, lpq_command, &fd, NULL); - - if (fd == -1) { - DEBUG(5,("generic_queue_get: Can't read print queue status for printer %s\n", - printer_name )); - return 0; - } - - numlines = 0; - qlines = fd_lines_load(fd, &numlines,0,NULL); - close(fd); - - /* turn the lpq output into a series of job structures */ - qcount = 0; - ZERO_STRUCTP(status); - if (numlines && qlines) { - queue = SMB_MALLOC_ARRAY(print_queue_struct, numlines+1); - if (!queue) { - TALLOC_FREE(qlines); - *q = NULL; - return 0; - } - memset(queue, '\0', sizeof(print_queue_struct)*(numlines+1)); - - for (i=0; i<numlines; i++) { - /* parse the line */ - if (parse_lpq_entry(printing_type,qlines[i], - &queue[qcount],status,qcount==0)) { - qcount++; - } - } - } - - TALLOC_FREE(qlines); - *q = queue; - return qcount; -} - /**************************************************************************** pause a queue ****************************************************************************/ |