Fix for machines that have their time changed forward, then back. Ensure
authorJeremy Allison <jra@samba.org>
Thu, 7 Mar 2002 21:51:59 +0000 (21:51 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 7 Mar 2002 21:51:59 +0000 (21:51 +0000)
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
source3/printing/printing.c

index 9002fea582bc66d3cd638b211a3e9a9d5b24e3ce..0a733b580a12113c709a11bbf3ac1f54db2900eb 100644 (file)
@@ -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_ */
index 7d4a52c3518dfc129bf0cd0ef95a1e0188fd8a96..81a44d7e690c42718392bd6b6ba8bad051184b63 100644 (file)
@@ -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;