[SCM] Samba Shared Repository - branch v3-6-test updated

Jeremy Allison jra at samba.org
Fri Jan 7 22:00:47 MST 2011


The branch, v3-6-test has been updated
       via  adfacdc Move wins_lookup_open_socket_in() to remove a compile warning.
       via  57dcab1 s3-printing: remove printer_list_need_refresh
       via  cde4ebd s3-printing: remove old entries in pcap_cache_replace
       via  29d67d6 s3-printing: Initiate pcap reload from parent smbd
       via  60b7c19 s3-printing: reload shares after pcap cache fill
      from  0838466 s3-waf: add NMBDSOCKETDIR variable.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit adfacdcfac94e7646dae3ed38a6ff3eeea9f5e84
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Jan 7 15:27:51 2011 -0800

    Move wins_lookup_open_socket_in() to remove a compile warning.
    
    Autobuild-User: Jeremy Allison <jra at samba.org>
    Autobuild-Date: Sat Jan  8 01:48:27 CET 2011 on sn-devel-104

commit 57dcab12d1ac2098ec77a1c5533a85f5b31f8a0e
Author: David Disseldorp <ddiss at suse.de>
Date:   Tue Dec 28 15:54:54 2010 +0100

    s3-printing: remove printer_list_need_refresh
    
    printer_list_need_refresh() was used previously to ensure one smbd
    process did not attempt to update the printer_list tdb during or soon
    after update by another smbd.
    
    It is no longer needed, as pcap updates are now only performed by the
    parent smbd process following startup, SIGHUP, config update or printcap
    cache time expiry.

commit cde4ebd2bf9c2288fe954e3c51c8cf3b0ec3fb2d
Author: David Disseldorp <ddiss at suse.de>
Date:   Tue Dec 28 14:55:01 2010 +0100

    s3-printing: remove old entries in pcap_cache_replace
    
    Callers of pcap_cache_replace() assume the existing printcap cache is
    replaced by the new values provided. This is not currently the case,
    old entries should be removed.

commit 29d67d615278f00e9bc6ae4583c209fa836f3b72
Author: David Disseldorp <ddiss at suse.de>
Date:   Thu Dec 23 12:14:21 2010 +0100

    s3-printing: Initiate pcap reload from parent smbd
    
    Since commit 7022554, smbds share a printcap cache (printer_list.tdb),
    therefore ordering of events between smbd processes is important when
    updating printcap cache information. Consider the following two process
    example:
    1) smbd1 receives HUP or printcap cache time expiry
    2) smbd1 checks whether pcap needs refresh, it does
    3) smbd1 marks pcap as refreshed
    4) smbd1 forks child1 to obtain cups printer info
    5) smbd2 receives HUP or printcap cache time expiry
    6) smbd2 checks whether pcap needs refresh, it does not (due to step 3)
    7) smbd2 reloads printer shares prior to child1 completion (stale pcap)
    8) child1 completion, pcap cache (printer_list.tdb) is updated by smbd1
    9) smbd1 reloads printer shares based on new pcap information
    
    In this case both smbd1 and smbd2 are reliant on the pcap update
    performed on child1 completion.
    The prior commit "reload shares after pcap cache fill" ensures that
    smbd1 only reloads printer shares following pcap update, however smbd2
    continues to present shares based on stale pcap data.
    
    This commit addresses the above problem by driving pcap cache and
    printer share updates from the parent smbd process.
    1) smbd0 (parent) receives a HUP or printcap cache time expiry
    2) smbd0 forks child0 to obtain cups printer info
    3) child0 completion, pcap cache (printer_list.tdb) is updated by smbd0
    4) smbd0 reloads printer shares
    5) smbd0 notifies child smbds of pcap update via message_send_all()
    6) child smbds read fresh pcap data and reload printer shares
    
    This architecture has the additional advantage that only a single
    process (the parent smbd) requests printer information from the printcap
    backend.
    
    Use time_mono in housekeeping functions As suggested by Björn Jacke.

commit 60b7c19739acf3c18dc4071e96e3311a32237506
Author: David Disseldorp <ddiss at suse.de>
Date:   Sun Dec 19 19:52:08 2010 +0100

    s3-printing: reload shares after pcap cache fill
    
    Since commit eada8f8a, updates to the cups pcap cache are performed
    asynchronously - cups_cache_reload() forks a child process to request
    cups printer information and notify the parent smbd on completion.
    
    Currently printer shares are reloaded immediately following the call to
    cups_cache_reload(), this occurs prior to smbd receiving new cups pcap
    information from the child process. Such behaviour can result in stale
    print shares as outlined in bug 7836.
    
    This fix ensures print shares are only reloaded after new pcap data has
    been received.
    
    Pair-Programmed-With: Lars Müller <lars at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/printing/printcapcachetime.xml |    4 +-
 nsswitch/wins.c                                    |   87 ++++++++++----------
 source3/include/local.h                            |    1 +
 source3/include/proto.h                            |    9 ++-
 source3/librpc/idl/messaging.idl                   |    1 +
 source3/printing/load.c                            |    6 +-
 source3/printing/pcap.c                            |   41 +++++++--
 source3/printing/pcap.h                            |    6 +-
 source3/printing/print_cups.c                      |   49 ++++++++---
 source3/printing/printer_list.c                    |   26 ------
 source3/printing/printer_list.h                    |    9 --
 source3/smbd/globals.c                             |    1 -
 source3/smbd/globals.h                             |    1 -
 source3/smbd/process.c                             |   44 ++--------
 source3/smbd/server.c                              |   50 +++++++++++-
 source3/smbd/server_reload.c                       |   22 ++++--
 source3/web/swat.c                                 |   11 ++-
 17 files changed, 209 insertions(+), 159 deletions(-)


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/printing/printcapcachetime.xml b/docs-xml/smbdotconf/printing/printcapcachetime.xml
index 7dcd1b6..e9e0c98 100644
--- a/docs-xml/smbdotconf/printing/printcapcachetime.xml
+++ b/docs-xml/smbdotconf/printing/printcapcachetime.xml
@@ -5,9 +5,7 @@
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
     <para>This option specifies the number of seconds before the printing
-    subsystem is again asked for the known printers.  If the value
-    is greater than 60 the initial waiting time is set to 60 seconds
-    to allow an earlier first rescan of the printing subsystem.
+    subsystem is again asked for the known printers.
     </para>
 
     <para>Setting this parameter to 0 disables any rescanning for new 
diff --git a/nsswitch/wins.c b/nsswitch/wins.c
index 51b78fb..eba27bc 100644
--- a/nsswitch/wins.c
+++ b/nsswitch/wins.c
@@ -45,50 +45,6 @@ NSS_STATUS _nss_wins_gethostbyname_r(const char *hostname, struct hostent *he,
 NSS_STATUS _nss_wins_gethostbyname2_r(const char *name, int af, struct hostent *he,
 			   char *buffer, size_t buflen, int *h_errnop);
 
-/* Use our own create socket code so we don't recurse.... */
-
-static int wins_lookup_open_socket_in(void)
-{
-	struct sockaddr_in sock;
-	int val=1;
-	int res;
-
-	memset((char *)&sock,'\0',sizeof(sock));
-
-#ifdef HAVE_SOCK_SIN_LEN
-	sock.sin_len = sizeof(sock);
-#endif
-	sock.sin_port = 0;
-	sock.sin_family = AF_INET;
-	sock.sin_addr.s_addr = interpret_addr("0.0.0.0");
-	res = socket(AF_INET, SOCK_DGRAM, 0);
-	if (res == -1)
-		return -1;
-
-	if (setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) != 0) {
-		close(res);
-		return -1;
-	}
-#ifdef SO_REUSEPORT
-	if (setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val)) != 0) {
-		close(res);
-		return -1;
-	}
-#endif /* SO_REUSEPORT */
-
-	/* now we've got a socket - we need to bind it */
-
-	if (bind(res, (struct sockaddr * ) &sock,sizeof(sock)) < 0) {
-		close(res);
-		return(-1);
-	}
-
-	set_socket_options(res,"SO_BROADCAST");
-
-	return res;
-}
-
-
 static void nss_wins_init(void)
 {
 	initialised = 1;
@@ -158,6 +114,49 @@ static struct in_addr *lookup_byname_backend(const char *name, int *count)
 
 #ifdef HAVE_NS_API_H
 
+/* Use our own create socket code so we don't recurse.... */
+
+static int wins_lookup_open_socket_in(void)
+{
+	struct sockaddr_in sock;
+	int val=1;
+	int res;
+
+	memset((char *)&sock,'\0',sizeof(sock));
+
+#ifdef HAVE_SOCK_SIN_LEN
+	sock.sin_len = sizeof(sock);
+#endif
+	sock.sin_port = 0;
+	sock.sin_family = AF_INET;
+	sock.sin_addr.s_addr = interpret_addr("0.0.0.0");
+	res = socket(AF_INET, SOCK_DGRAM, 0);
+	if (res == -1)
+		return -1;
+
+	if (setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) != 0) {
+		close(res);
+		return -1;
+	}
+#ifdef SO_REUSEPORT
+	if (setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val)) != 0) {
+		close(res);
+		return -1;
+	}
+#endif /* SO_REUSEPORT */
+
+	/* now we've got a socket - we need to bind it */
+
+	if (bind(res, (struct sockaddr * ) &sock,sizeof(sock)) < 0) {
+		close(res);
+		return(-1);
+	}
+
+	set_socket_options(res,"SO_BROADCAST");
+
+	return res;
+}
+
 static struct node_status *lookup_byaddr_backend(char *addr, int *count)
 {
 	int fd;
diff --git a/source3/include/local.h b/source3/include/local.h
index a8889af..bb73840 100644
--- a/source3/include/local.h
+++ b/source3/include/local.h
@@ -139,6 +139,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/include/proto.h b/source3/include/proto.h
index 0775acd..338c27d 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4062,7 +4062,9 @@ void notify_printer_sepfile(struct tevent_context *ev,
 /* The following definitions come from printing/pcap.c  */
 
 void pcap_cache_reload(struct tevent_context *ev,
-		       struct messaging_context *msg_ctx);
+		       struct messaging_context *msg_ctx,
+		       void (*post_cache_fill_fn)(struct tevent_context *,
+						  struct messaging_context *));
 bool pcap_printername_ok(const char *printername);
 
 /* The following definitions come from printing/printing.c  */
@@ -5399,9 +5401,12 @@ void server_messaging_context_free(void);
 struct event_context *smbd_event_context(void);
 struct messaging_context *smbd_messaging_context(void);
 struct memcache *smbd_memcache(void);
-void reload_printers(struct messaging_context *msg_ctx);
+void reload_printers(struct tevent_context *ev,
+		     struct messaging_context *msg_ctx);
 bool reload_services(struct messaging_context *msg_ctx, int smb_sock,
 		     bool test);
+void reload_pcap_change_notify(struct tevent_context *ev,
+			       struct messaging_context *msg_ctx);
 void exit_server(const char *const explanation);
 void exit_server_cleanly(const char *const explanation);
 void exit_server_fault(void);
diff --git a/source3/librpc/idl/messaging.idl b/source3/librpc/idl/messaging.idl
index 9041d22..faa9a6e 100644
--- a/source3/librpc/idl/messaging.idl
+++ b/source3/librpc/idl/messaging.idl
@@ -45,6 +45,7 @@ interface messaging
 		MSG_PRINTERDATA_INIT_RESET	= 0x0204,
 		MSG_PRINTER_UPDATE		= 0x0205,
 		MSG_PRINTER_MOD			= 0x0206,
+		MSG_PRINTER_PCAP		= 0x0207,
 
 		/* smbd messages */
 		MSG_SMB_CONF_UPDATED		= 0x0301,
diff --git a/source3/printing/load.c b/source3/printing/load.c
index 4f1bb88..66c3ffd 100644
--- a/source3/printing/load.c
+++ b/source3/printing/load.c
@@ -54,14 +54,12 @@ static void add_auto_printers(void)
 }
 
 /***************************************************************************
-load automatic printer services
+load automatic printer services from pre-populated pcap cache
 ***************************************************************************/
 void load_printers(struct tevent_context *ev,
 		   struct messaging_context *msg_ctx)
 {
-	if (!pcap_cache_loaded()) {
-		pcap_cache_reload(ev, msg_ctx);
-	}
+	SMB_ASSERT(pcap_cache_loaded());
 
 	add_auto_printers();
 
diff --git a/source3/printing/pcap.c b/source3/printing/pcap.c
index 1b8f46d..7208f4b 100644
--- a/source3/printing/pcap.c
+++ b/source3/printing/pcap.c
@@ -97,21 +97,39 @@ bool pcap_cache_loaded(void)
 	return NT_STATUS_IS_OK(status);
 }
 
-void pcap_cache_replace(const struct pcap_cache *pcache)
+bool pcap_cache_replace(const struct pcap_cache *pcache)
 {
 	const struct pcap_cache *p;
+	NTSTATUS status;
+
+	status = printer_list_mark_reload();
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0, ("Failed to mark printer list for reload!\n"));
+		return false;
+	}
 
 	for (p = pcache; p; p = p->next) {
 		pcap_cache_add(p->name, p->comment);
 	}
+
+	status = printer_list_clean_old();
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0, ("Failed to cleanup printer list!\n"));
+		return false;
+	}
+
+	return true;
 }
 
 void pcap_cache_reload(struct tevent_context *ev,
-		       struct messaging_context *msg_ctx)
+		       struct messaging_context *msg_ctx,
+		       void (*post_cache_fill_fn)(struct tevent_context *,
+						  struct messaging_context *))
 {
 	const char *pcap_name = lp_printcapname();
 	bool pcap_reloaded = False;
 	NTSTATUS status;
+	bool post_cache_fill_fn_handled = false;
 
 	DEBUG(3, ("reloading printcap cache\n"));
 
@@ -121,12 +139,6 @@ void pcap_cache_reload(struct tevent_context *ev,
 		return;
 	}
 
-	if (!printer_list_need_refresh()) {
-		/* has been just refeshed, skip */
-		DEBUG(5, ("Refresh just happend, skipping.\n"));
-		return;
-	}
-
 	status = printer_list_mark_reload();
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(0, ("Failed to mark printer list for reload!\n"));
@@ -135,7 +147,13 @@ void pcap_cache_reload(struct tevent_context *ev,
 
 #ifdef HAVE_CUPS
 	if (strequal(pcap_name, "cups")) {
-		pcap_reloaded = cups_cache_reload(ev, msg_ctx);
+		pcap_reloaded = cups_cache_reload(ev, msg_ctx,
+						  post_cache_fill_fn);
+		/*
+		 * cups_cache_reload() is async and calls post_cache_fill_fn()
+		 * on successful completion
+		 */
+		post_cache_fill_fn_handled = true;
 		goto done;
 	}
 #endif
@@ -166,7 +184,7 @@ void pcap_cache_reload(struct tevent_context *ev,
 done:
 	DEBUG(3, ("reload status: %s\n", (pcap_reloaded) ? "ok" : "error"));
 
-	if (pcap_reloaded) {
+	if ((pcap_reloaded) && (post_cache_fill_fn_handled == false)) {
 		/* cleanup old entries only if the operation was successful,
 		 * otherwise keep around the old entries until we can
 		 * successfuly reaload */
@@ -174,6 +192,9 @@ done:
 		if (!NT_STATUS_IS_OK(status)) {
 			DEBUG(0, ("Failed to cleanup printer list!\n"));
 		}
+		if (post_cache_fill_fn != NULL) {
+			post_cache_fill_fn(ev, msg_ctx);
+		}
 	}
 
 	return;
diff --git a/source3/printing/pcap.h b/source3/printing/pcap.h
index 67f36d6..4198be1 100644
--- a/source3/printing/pcap.h
+++ b/source3/printing/pcap.h
@@ -24,7 +24,7 @@ bool pcap_cache_add_specific(struct pcap_cache **ppcache, const char *name, cons
 void pcap_cache_destroy_specific(struct pcap_cache **ppcache);
 bool pcap_cache_add(const char *name, const char *comment);
 bool pcap_cache_loaded(void);
-void pcap_cache_replace(const struct pcap_cache *cache);
+bool pcap_cache_replace(const struct pcap_cache *cache);
 void pcap_printer_fn_specific(const struct pcap_cache *, void (*fn)(const char *, const char *, void *), void *);
 void pcap_printer_fn(void (*fn)(const char *, const char *, void *), void *);
 
@@ -35,7 +35,9 @@ bool aix_cache_reload(void);
 /* The following definitions come from printing/print_cups.c  */
 
 bool cups_cache_reload(struct tevent_context *ev,
-		       struct messaging_context *msg_ctx);
+		       struct messaging_context *msg_ctx,
+		       void (*post_cache_fill_fn)(struct tevent_context *,
+						  struct messaging_context *));
 bool cups_pull_comment_location(TALLOC_CTX *mem_ctx,
 				const char *printername,
 				char **comment,
diff --git a/source3/printing/print_cups.c b/source3/printing/print_cups.c
index a85fba8..0e5dac5 100644
--- a/source3/printing/print_cups.c
+++ b/source3/printing/print_cups.c
@@ -449,13 +449,22 @@ static bool cups_pcap_load_async(struct tevent_context *ev,
 	_exit(0);
 }
 
+struct cups_async_cb_args {
+	int pipe_fd;
+	struct event_context *event_ctx;
+	struct messaging_context *msg_ctx;
+	void (*post_cache_fill_fn)(struct event_context *,
+				   struct messaging_context *);
+};
+
 static void cups_async_callback(struct event_context *event_ctx,
 				struct fd_event *event,
 				uint16 flags,
 				void *p)
 {
 	TALLOC_CTX *frame = talloc_stackframe();
-	int fd = *(int *)p;
+	struct cups_async_cb_args *cb_args = (struct cups_async_cb_args *)p;
+	int fd = cb_args->pipe_fd;
 	struct pcap_cache *tmp_pcap_cache = NULL;
 
 	DEBUG(5,("cups_async_callback: callback received for printer data. "
@@ -543,34 +552,52 @@ static void cups_async_callback(struct event_context *event_ctx,
 
 	TALLOC_FREE(frame);
 	if (tmp_pcap_cache) {
+		bool ret;
 		/* We got a namelist, replace our local cache. */
 		pcap_cache_destroy_specific(&local_pcap_copy);
 		local_pcap_copy = tmp_pcap_cache;
 
 		/* And the systemwide pcap cache. */
-		pcap_cache_replace(local_pcap_copy);
+		ret = pcap_cache_replace(local_pcap_copy);
+		if (!ret)
+			DEBUG(0, ("failed to replace pcap cache\n"));
+
+		/* Caller may have requested post cache fill callback */
+		if (ret && cb_args->post_cache_fill_fn != NULL) {
+			cb_args->post_cache_fill_fn(cb_args->event_ctx,
+						    cb_args->msg_ctx);
+		}
 	} else {
 		DEBUG(2,("cups_async_callback: failed to read a new "
 			"printer list\n"));
 	}
 	close(fd);
-	TALLOC_FREE(p);
+	TALLOC_FREE(cb_args);
 	TALLOC_FREE(cache_fd_event);
 }
 
 bool cups_cache_reload(struct tevent_context *ev,
-		       struct messaging_context *msg_ctx)
+		       struct messaging_context *msg_ctx,
+		       void (*post_cache_fill_fn)(struct tevent_context *,
+						  struct messaging_context *))
 {
-	int *p_pipe_fd = TALLOC_P(NULL, int);
+	struct cups_async_cb_args *cb_args;
+	int *p_pipe_fd;
 
-	if (!p_pipe_fd) {
+	cb_args = TALLOC_P(NULL, struct cups_async_cb_args);
+	if (cb_args == NULL) {
 		return false;
 	}
 
+	cb_args->post_cache_fill_fn = post_cache_fill_fn;
+	cb_args->event_ctx = ev;
+	cb_args->msg_ctx = msg_ctx;
+	p_pipe_fd = &cb_args->pipe_fd;
 	*p_pipe_fd = -1;
 
 	/* Set up an async refresh. */
 	if (!cups_pcap_load_async(ev, msg_ctx, p_pipe_fd)) {
+		talloc_free(cb_args);
 		return false;
 	}
 	if (!local_pcap_copy) {
@@ -582,15 +609,11 @@ bool cups_cache_reload(struct tevent_context *ev,
 
 		cups_async_callback(ev, NULL,
 					EVENT_FD_READ,
-					(void *)p_pipe_fd);
+					(void *)cb_args);
 		if (!local_pcap_copy) {
 			return false;
 		}
 	} else {
-		/* Replace the system cache with our
-		 * local copy. */
-		pcap_cache_replace(local_pcap_copy);
-
 		DEBUG(10,("cups_cache_reload: async read on fd %d\n",
 			*p_pipe_fd ));
 
@@ -599,10 +622,10 @@ bool cups_cache_reload(struct tevent_context *ev,
 					NULL, *p_pipe_fd,
 					EVENT_FD_READ,
 					cups_async_callback,
-					(void *)p_pipe_fd);
+					(void *)cb_args);
 		if (!cache_fd_event) {
 			close(*p_pipe_fd);
-			TALLOC_FREE(p_pipe_fd);
+			TALLOC_FREE(cb_args);
 			return false;
 		}
 	}
diff --git a/source3/printing/printer_list.c b/source3/printing/printer_list.c
index f3f00f0..d36a746 100644
--- a/source3/printing/printer_list.c
+++ b/source3/printing/printer_list.c
@@ -215,32 +215,6 @@ done:
 	return status;
 }
 
-bool printer_list_need_refresh(void)
-{
-	NTSTATUS status;
-	time_t last_refresh;
-	int timediff;
-
-	status = printer_list_get_last_refresh(&last_refresh);
-	if (!NT_STATUS_IS_OK(status)) {
-		return true;
-	}
-	timediff = time_mono(NULL) - last_refresh;
-
-	if (timediff > 1 ) {
-		/* if refresh occurred more than 1s (TODO:use lp_printcap_cache_time) ago,
-		 * then we need to refresh */
-		return true;
-	} else if (timediff < 0) {
-		/* last_refresh newer than now. Seems we have no monotonic
-		 * clock and the clock was adjusted backwards.
-		 * we need to refresh which also resets last_refresh */
-		return true;
-	}
-
-	return false;
-}
-
 NTSTATUS printer_list_mark_reload(void)
 {
 	struct db_context *db;
diff --git a/source3/printing/printer_list.h b/source3/printing/printer_list.h
index bdcf308..fce3e34 100644
--- a/source3/printing/printer_list.h
+++ b/source3/printing/printer_list.h
@@ -96,13 +96,4 @@ NTSTATUS printer_list_clean_old(void);
 
 NTSTATUS printer_list_run_fn(void (*fn)(const char *, const char *, void *),
 			     void *private_data);
-
-/**
- * @brief Check if the printer list needs to be refreshed.
- *
- * @return              True if the database needs to be refreshed, false if
- *                      not.
- */
-bool printer_list_need_refresh(void);
-
 #endif /* _PRINTER_LIST_H_ */
diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c
index aac30ea..ca97884 100644
--- a/source3/smbd/globals.c
+++ b/source3/smbd/globals.c
@@ -54,7 +54,6 @@ struct msg_state *smbd_msg_state = NULL;
 
 bool logged_ioctl_message = false;
 
-pid_t mypid = 0;
 time_t last_smb_conf_reload_time = 0;
 time_t last_printer_reload_time = 0;
 /****************************************************************************
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index cb97cb5..7771049 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -61,7 +61,6 @@ extern bool logged_ioctl_message;
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list