1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-04 17:47:26 +03:00

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 commit is contained in:
Jeremy Allison -
parent 4b4430f1c5
commit 39fca711a5
2 changed files with 25 additions and 6 deletions

View 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_ */

View 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;