From 1c2f1543230b2a016b026e1f3a03a52f0d9d76d7 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Thu, 9 Feb 2012 12:08:27 +0100 Subject: 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. --- source3/printing/print_generic.c | 145 ++++++++++++++++++++++++--------------- 1 file changed, 88 insertions(+), 57 deletions(-) (limited to 'source3') 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 @@ -138,6 +138,62 @@ static int generic_job_resume(int snum, struct printjob *pjob) NULL); } +/**************************************************************************** +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; isysjob = -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