summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/Makefile.in3
-rw-r--r--source3/configure.in3
-rw-r--r--source3/nsswitch/winbindd.h4
-rw-r--r--source3/nsswitch/winbindd_dual.c16
4 files changed, 25 insertions, 1 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in
index c178fbaa85..a6cc3d8255 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -35,6 +35,7 @@ PASSDB_LIBS=@PASSDB_LIBS@
IDMAP_LIBS=@IDMAP_LIBS@
KRB5LIBS=@KRB5_LIBS@
LDAP_LIBS=@LDAP_LIBS@
+NSCD_LIBS=@NSCD_LIBS@
INSTALLCMD=@INSTALL@
INSTALLLIBCMD_SH=@INSTALLLIBCMD_SH@
@@ -1180,7 +1181,7 @@ bin/librpc_echo.@SHLIBEXT@: $(RPC_ECHO_OBJ)
bin/winbindd@EXEEXT@: $(WINBINDD_OBJ) @BUILD_POPT@ bin/.dummy
@echo "Linking $@"
@$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(WINBINDD_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS) \
- @POPTLIBS@ $(KRB5LIBS) $(LDAP_LIBS) $(PASSDB_LIBS)
+ @POPTLIBS@ $(KRB5LIBS) $(LDAP_LIBS) $(PASSDB_LIBS) $(NSCD_LIBS)
# Please don't add .o files to libnss_winbind, libnss_wins, or the pam_winbind
# libraries. Add to the appropriate PICOBJ variable instead.
diff --git a/source3/configure.in b/source3/configure.in
index fd1648010d..7369b07959 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -266,6 +266,7 @@ AC_SUBST(UNINSTALL_CIFSMOUNT)
AC_SUBST(EXTRA_SBIN_PROGS)
AC_SUBST(EXTRA_ALL_TARGETS)
AC_SUBST(CONFIG_LIBS)
+AC_SUBST(NSCD_LIBS)
# Set defaults
PIE_CFLAGS=""
@@ -3528,6 +3529,8 @@ if test x"$with_ads_support" != x"no"; then
LIBS="$ac_save_LIBS"
fi
+AC_CHECK_LIB_EXT(nscd, NSCD_LIBS, nscd_flush_cache)
+
#################################################
# check for automount support
AC_MSG_CHECKING(whether to use automount)
diff --git a/source3/nsswitch/winbindd.h b/source3/nsswitch/winbindd.h
index e81102571c..6a220438a9 100644
--- a/source3/nsswitch/winbindd.h
+++ b/source3/nsswitch/winbindd.h
@@ -29,6 +29,10 @@
#include "winbindd_nss.h"
+#ifdef HAVE_LIBNSCD
+#include "libnscd.h"
+#endif
+
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_WINBIND
diff --git a/source3/nsswitch/winbindd_dual.c b/source3/nsswitch/winbindd_dual.c
index 7864254c46..b77f499799 100644
--- a/source3/nsswitch/winbindd_dual.c
+++ b/source3/nsswitch/winbindd_dual.c
@@ -559,6 +559,7 @@ static void child_msg_offline(int msg_type, struct process_id src, void *buf, si
static void child_msg_online(int msg_type, struct process_id src, void *buf, size_t len)
{
struct winbindd_domain *domain;
+ int ret;
DEBUG(5,("child_msg_online received.\n"));
@@ -570,6 +571,21 @@ static void child_msg_online(int msg_type, struct process_id src, void *buf, siz
/* Set our global state as online. */
set_global_winbindd_state_online();
+#ifdef HAVE_NSCD_FLUSH_CACHE
+ /* Flush nscd caches to get accurate new information */
+ ret = nscd_flush_cache("passwd");
+ if (ret) {
+ DEBUG(5,("failed to flush nscd cache for 'passwd' service: %s\n",
+ error_message(ret)));
+ }
+
+ ret = nscd_flush_cache("group");
+ if (ret) {
+ DEBUG(5,("failed to flush nscd cache for 'group' service: %s\n",
+ error_message(ret)));
+ }
+#endif
+
/* Mark everything online - delete any negative cache entries
to force an immediate reconnect. */