diff options
author | Jeremy Allison <jra@samba.org> | 2010-03-25 18:22:16 -0700 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2010-04-15 16:53:57 +0200 |
commit | 302e9b1c027ff3bddbdeb16f97aa6159311e439d (patch) | |
tree | 08776081c111b46e313051d620281b5f94363680 /source3 | |
parent | 3dab33103f4eddabdb908498200d888dfa6ae5a9 (diff) | |
download | samba-302e9b1c027ff3bddbdeb16f97aa6159311e439d.tar.gz |
Fix bug #7288 - SMB job IDs in CUPS job names wrong.
Based on a patch from Michael Karcher <samba@mkarcher.dialup.fu-berlin.de>.
I think this is the correct fix. It causes cups_job_submit to use
print_parse_jobid(), which I've moved into printing/lpq_parse.c (to allow the
link to work).
It turns out the old print_parse_jobid() was *broken*, in that the pjob
filename was set as an absolute path - not relative to the sharename (due to it
not going through the VFS calls).
This meant that the original code doing a strncmp on the first part of the
filename would always fail - it starts with a "/", not the relative pathname of
PRINT_SPOOL_PREFIX ("smbprn.").
This fix could fix some other mysterious printing bugs - probably the ones
Guenther noticed where job control fails on non-cups backends.
Contains c79ca41baf15b4ef7eb287d343b17a53ba41e852 and
92332fb2368c641db1552d1f2a2f7b3deaa11519 from master.
Jeremy.
(cherry picked from commit 12936bfeb36ae867b52fe48d0f6d3d17d5c8b110)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/proto.h | 1 | ||||
-rw-r--r-- | source3/printing/lpq_parse.c | 21 | ||||
-rw-r--r-- | source3/printing/print_cups.c | 11 | ||||
-rw-r--r-- | source3/printing/printing.c | 21 |
4 files changed, 32 insertions, 22 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index b22c530f08f..34b9f83f2af 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -4757,6 +4757,7 @@ void load_printers(void); bool parse_lpq_entry(enum printing_types printing_type,char *line, print_queue_struct *buf, print_status_struct *status,bool first); +uint32_t print_parse_jobid(const char *fname); /* The following definitions come from printing/notify.c */ diff --git a/source3/printing/lpq_parse.c b/source3/printing/lpq_parse.c index addf2d14aac..16b9b09fef3 100644 --- a/source3/printing/lpq_parse.c +++ b/source3/printing/lpq_parse.c @@ -18,6 +18,7 @@ */ #include "includes.h" +#include "printing.h" static const char *Months[13] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Err"}; @@ -1150,3 +1151,23 @@ bool parse_lpq_entry(enum printing_types printing_type,char *line, return ret; } + +/**************************************************************************** + Parse a file name from the system spooler to generate a jobid. +****************************************************************************/ + +uint32_t print_parse_jobid(const char *fname) +{ + int jobid; + const char *p = strstr_m(fname,PRINT_SPOOL_PREFIX); + + if (!p) { + return (uint32_t)-1; + } + p += strlen(PRINT_SPOOL_PREFIX); + jobid = atoi(p); + if (jobid <= 0) { + return (uint32_t)-1; + } + return (uint32_t)jobid; +} diff --git a/source3/printing/print_cups.c b/source3/printing/print_cups.c index 8c75b7d6890..e2c8b7e0fbf 100644 --- a/source3/printing/print_cups.c +++ b/source3/printing/print_cups.c @@ -913,6 +913,7 @@ static int cups_job_submit(int snum, struct printjob *pjob) char *cupsoptions = NULL; char *filename = NULL; size_t size; + uint32_t jobid = (uint32_t)-1; char addr[INET6_ADDRSTRLEN]; DEBUG(5,("cups_job_submit(%d, %p)\n", snum, pjob)); @@ -979,12 +980,20 @@ static int cups_job_submit(int snum, struct printjob *pjob) "job-originating-host-name", NULL, clientname); + /* Get the jobid from the filename. */ + jobid = print_parse_jobid(pjob->filename); + if (jobid == (uint32_t)-1) { + DEBUG(0,("cups_job_submit: failed to parse jobid from name %s\n", + pjob->filename )); + jobid = 0; + } + if (!push_utf8_talloc(frame, &jobname, pjob->jobname, &size)) { goto out; } new_jobname = talloc_asprintf(frame, "%s%.8u %s", PRINT_SPOOL_PREFIX, - (unsigned int)pjob->smbjob, + (unsigned int)jobid, jobname); if (new_jobname == NULL) { goto out; diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 10cd1d7dc69..e4aaf4c335e 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -644,25 +644,6 @@ void pjob_delete(const char* sharename, uint32 jobid) } /**************************************************************************** - Parse a file name from the system spooler to generate a jobid. -****************************************************************************/ - -static uint32 print_parse_jobid(char *fname) -{ - int jobid; - - if (strncmp(fname,PRINT_SPOOL_PREFIX,strlen(PRINT_SPOOL_PREFIX)) != 0) - return (uint32)-1; - fname += strlen(PRINT_SPOOL_PREFIX); - - jobid = atoi(fname); - if (jobid <= 0) - return (uint32)-1; - - return (uint32)jobid; -} - -/**************************************************************************** List a unix job in the print database. ****************************************************************************/ @@ -2591,8 +2572,6 @@ bool print_job_end(int snum, uint32 jobid, enum file_close_type close_type) return True; } - pjob->smbjob = jobid; - ret = (*(current_printif->job_submit))(snum, pjob); if (ret) |