diff options
author | Jeremy Allison <jra@samba.org> | 2000-10-10 21:52:31 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2000-10-10 21:52:31 +0000 |
commit | cdb71ca5181aa1e06bebe2fffb02dc39de83645e (patch) | |
tree | 19b23d77aa31da1d109bf54cc03b18111a05b083 /source3/printing | |
parent | e8912baf025a1356aa8c02f971fbe3d67adc9b0a (diff) | |
download | samba-cdb71ca5181aa1e06bebe2fffb02dc39de83645e.tar.gz samba-cdb71ca5181aa1e06bebe2fffb02dc39de83645e.tar.bz2 samba-cdb71ca5181aa1e06bebe2fffb02dc39de83645e.zip |
Fixes to periodically scan printing.tdb in idle time and occasionally
on exit. Needed to fix printing.tdb from groving to 300Mb+ if being
driven by smbclient clients that never ask for status... (effective
DOS attack :-).
Jeremy.
(This used to be commit 6581066b93a674fadf6f9b92441428d2cc8b4a02)
Diffstat (limited to 'source3/printing')
-rw-r--r-- | source3/printing/printing.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 9054c8f36a..486ef5d2c7 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -300,6 +300,14 @@ static void print_queue_update(int snum) fstring keystr; TDB_DATA data, key; + /* + * Update the cache time FIRST ! Stops others doing this + * if the lpq takes a long time. + */ + + slprintf(keystr, sizeof(keystr), "CACHE/%s", lp_servicename(snum)); + tdb_store_int(tdb, keystr, (int)time(NULL)); + slprintf(tmp_file, sizeof(tmp_file), "%s/smblpq.%d", path, local_pid); unlink(tmp_file); @@ -380,7 +388,11 @@ static void print_queue_update(int snum) key.dsize = strlen(keystr); tdb_store(tdb, key, data, TDB_REPLACE); - /* update the cache time */ + /* + * Update the cache time again. We want to do this call + * as little as possible... + */ + slprintf(keystr, sizeof(keystr), "CACHE/%s", lp_servicename(snum)); tdb_store_int(tdb, keystr, (int)time(NULL)); } @@ -1008,7 +1020,36 @@ BOOL print_queue_purge(struct current_user *user, int snum, int *errcode) } print_cache_flush(snum); + safe_free(queue); return True; } + +/**************************************************************************** + Periodically run a status on all the queues to ensure the tdb doesn't grow. + Note that this will have no effect if the client is doing its own status + queries. This code is here to clean up jobs submitted by non-Windows printer + clients (eg. smbclient) that never do a status check. +****************************************************************************/ + +void process_print_queue(time_t t) +{ + static time_t last_check_time; + int services = lp_numservices(); + print_queue_struct *queue; + print_status_struct status; + int snum; + + if ((t != (time_t)-1) && ((t - last_check_time) < lp_lpqcachetime())) + return; + + last_check_time = t; + + for (snum = 0; snum < services; snum++) { + if (lp_snum_ok(snum) && lp_print_ok(snum) && lp_browseable(snum)) { + (void)print_queue_status(snum, &queue,&status); + safe_free(queue); + } + } +} #undef OLD_NTDOMAIN |