summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Disseldorp <ddiss@suse.de>2011-01-10 14:08:07 +0100
committerKarolin Seeger <kseeger@samba.org>2011-01-15 17:19:24 +0100
commit2c2ce9caead5a13edb582313b7d36c7eb12a09fb (patch)
tree9caf04a15c881968edafca1f5215923e26c149a5
parent9bc0cd243ac66126d42905dd8710d078094e0cd7 (diff)
downloadsamba-2c2ce9caead5a13edb582313b7d36c7eb12a09fb.tar.gz
s3-printing: update parent smbd pcap cache
If a client connects to a samba share and while connected a printer is added, the client will see the new printer share after a maximum of 'printcap cache time' seconds. smbd's forked for new client connections inherit printcap information from the parent (listener) smbd, which does not perform updates on printcap cache time expiry. Therefore newly connected clients may initially be presented with stale printer shares. Add a housekeeping function to the parent smbd to ensure newly connected clients see up to date printer shares. The last 2 patches address bug #7836 (A newly added printer isn't visbile to clients).
-rw-r--r--source3/include/local.h1
-rw-r--r--source3/smbd/process.c4
-rw-r--r--source3/smbd/server.c16
3 files changed, 19 insertions, 2 deletions
diff --git a/source3/include/local.h b/source3/include/local.h
index a88b17be137..d65cc001a91 100644
--- a/source3/include/local.h
+++ b/source3/include/local.h
@@ -148,6 +148,7 @@
#define LPQ_LOCK_TIMEOUT (5)
#define NMBD_INTERFACES_RELOAD (120)
#define NMBD_UNEXPECTED_TIMEOUT (15)
+#define SMBD_HOUSEKEEPING_INTERVAL SMBD_SELECT_TIMEOUT
/* the following are in milliseconds */
#define LOCK_RETRY_TIMEOUT (100)
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 2abea8f4bcc..4b2e6eb79c2 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -1854,7 +1854,7 @@ void check_reload(time_t t)
|| (t-last_printer_reload_time < 0) )
{
DEBUG( 3,( "Printcap cache time expired.\n"));
- reload_printers();
+ pcap_cache_reload(&reload_printers);
last_printer_reload_time = t;
}
}
@@ -2123,7 +2123,7 @@ void smbd_process(void)
}
if (!(event_add_idle(smbd_event_context(), NULL,
- timeval_set(SMBD_SELECT_TIMEOUT, 0),
+ timeval_set(SMBD_HOUSEKEEPING_INTERVAL, 0),
"housekeeping", housekeeping_fn, NULL))) {
DEBUG(0, ("Could not add housekeeping event\n"));
exit(1);
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 72a15fc5575..6147526172c 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -498,6 +498,14 @@ static bool smbd_open_one_socket(struct smbd_parent_context *parent,
return true;
}
+static bool parent_housekeeping_fn(const struct timeval *now, void *private_data)
+{
+ DEBUG(5, ("houskeeping\n"));
+ /* check if we need to reload services */
+ check_reload(time(NULL));
+ return true;
+}
+
/****************************************************************************
Open the socket communication.
****************************************************************************/
@@ -625,6 +633,14 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent,
claim_connection(NULL,"",
FLAG_MSG_GENERAL|FLAG_MSG_SMBD|FLAG_MSG_DBWRAP);
+ if (!(event_add_idle(smbd_event_context(), NULL,
+ timeval_set(SMBD_HOUSEKEEPING_INTERVAL, 0),
+ "parent_housekeeping", parent_housekeeping_fn,
+ parent))) {
+ DEBUG(0, ("Could not add housekeeping event\n"));
+ exit(1);
+ }
+
/* Listen to messages */
messaging_register(smbd_messaging_context(), NULL,