1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-22 05:57:43 +03:00

smbd: only reprocess printer_list.tdb if it changed

The per-client smbd printer share inventory is currently updated from
printer_list.tdb when a client enumerates printers, via EnumPrinters or
NetShareEnum.
printer_list.tdb is populated by the background print process, based on
the latest printcap values retrieved from the printing backend (e.g.
CUPS) at regular intervals.
This change ensures that per-client smbd processes don't reparse
printer_list.tdb if it hasn't been updated since the last enumeration.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=10652

Suggested-by: Volker Lendecke <vl@samba.org>
Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
This commit is contained in:
David Disseldorp 2014-07-23 14:42:00 +02:00 committed by Andreas Schneider
parent 30ce835670
commit a2182e03a0

View File

@ -31,6 +31,13 @@
#include "messages.h"
#include "lib/param/loadparm.h"
/*
* The persistent pcap cache is populated by the background print process. Per
* client smbds should only reload their printer share inventories if this
* information has changed. Use reload_last_pcap_time to detect this.
*/
static time_t reload_last_pcap_time = 0;
static bool snum_is_shared_printer(int snum)
{
return (lp_browseable(snum) && lp_snum_ok(snum) && lp_printable(snum));
@ -61,6 +68,20 @@ void delete_and_reload_printers(struct tevent_context *ev,
const char *pname;
const char *sname;
NTSTATUS status;
bool ok;
time_t pcap_last_update;
ok = pcap_cache_loaded(&pcap_last_update);
if (!ok) {
DEBUG(1, ("pcap cache not loaded\n"));
return;
}
if (reload_last_pcap_time == pcap_last_update) {
DEBUG(5, ("skipping printer reload, already up to date.\n"));
return;
}
reload_last_pcap_time = pcap_last_update;
/* Get pcap printers updated */
load_printers(ev, msg_ctx);