From 024e69da0b4bbbe4112d3ce5526f90eb0b85bba0 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 7 Mar 2002 21:51:59 +0000 Subject: Fix for machines that have their time changed forward, then back. Ensure that any cached lpq information gathered during that time doesn't stay around for longer than 1 hour. Jeremy. (This used to be commit 39fca711a5cf15a03d6c79639b202712d1749a64) --- source3/include/printing.h | 7 +++++++ source3/printing/printing.c | 24 ++++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) (limited to 'source3') diff --git a/source3/include/printing.h b/source3/include/printing.h index 9002fea582..0a733b580a 100644 --- a/source3/include/printing.h +++ b/source3/include/printing.h @@ -1,3 +1,6 @@ +#ifndef PRINTING_H_ +#define PRINTING_H_ + /* Unix SMB/CIFS implementation. printing definitions @@ -64,5 +67,9 @@ extern struct printif cups_printif; #define UNIX_JOB_START PRINT_MAX_JOBID #define NEXT_JOBID(j) ((j+1) % PRINT_MAX_JOBID > 0 ? (j+1) % PRINT_MAX_JOBID : 1) +#define MAX_CACHE_VALID_TIME 3600 + #define PRINT_SPOOL_PREFIX "smbprn." #define PRINT_DATABASE_VERSION 2 + +#endif /* PRINTING_H_ */ diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 7d4a52c351..81a44d7e69 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -811,14 +811,26 @@ int print_job_write(int jobid, const char *buf, int size) static BOOL print_cache_expired(int snum) { fstring key; - time_t t2, t = time(NULL); + time_t last_qscan_time, time_now = time(NULL); - slprintf(key, sizeof(key)-1, "CACHE/%s", lp_servicename(snum)); - t2 = tdb_fetch_int32(tdb, key); - if (t2 == ((time_t)-1) || (t - t2) >= lp_lpqcachetime()) { + slprintf(key, sizeof(key), "CACHE/%s", lp_servicename(snum)); + last_qscan_time = (time_t)tdb_fetch_int32(tdb, key); + + /* + * Invalidate the queue for 3 reasons. + * (1). last queue scan time == -1. + * (2). Current time - last queue scan time > allowed cache time. + * (3). last queue scan time > current time + MAX_CACHE_VALID_TIME (1 hour by default). + * This last test picks up machines for which the clock has been moved + * forward, an lpq scan done and then the clock moved back. Otherwise + * that last lpq scan would stay around for a loooong loooong time... :-). JRA. + */ + + if (last_qscan_time == ((time_t)-1) || (time_now - last_qscan_time) >= lp_lpqcachetime() || + last_qscan_time > (time_now + MAX_CACHE_VALID_TIME)) { DEBUG(3, ("print cache expired for queue %s \ -(last_cache = %d, time now = %d, qcachetime = %d)\n", lp_servicename(snum), - (int)t2, (int)t, (int)lp_lpqcachetime() )); +(last_qscan_time = %d, time now = %d, qcachetime = %d)\n", lp_servicename(snum), + (int)last_qscan_time, (int)time_now, (int)lp_lpqcachetime() )); return True; } return False; -- cgit