summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2007-09-02 00:32:57 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:30:28 -0500
commitf9a177772d67a9dad7c34d30dd16d56df9ab8887 (patch)
treeb47959f91cb753b8632846a1bb61b0f3287cdb89
parent60abd094fa8af84a4f0db213143bc262e6b28ff9 (diff)
downloadsamba-f9a177772d67a9dad7c34d30dd16d56df9ab8887.tar.gz
samba-f9a177772d67a9dad7c34d30dd16d56df9ab8887.tar.bz2
samba-f9a177772d67a9dad7c34d30dd16d56df9ab8887.zip
r24879: Activate the winbindd cache-validation message handler.
Now the winbindd cache can be checked at runtime by calling "smbcontrol winbindd validate-cache". For the execution of the validation code, I fork a child and in the child restore the default SIGCHLD handler in order for the fork/waitpid mechanism of tdb_validate to work. Michael (This used to be commit f379a5c47d5004a5a66b6c12ec119c739b9e146d)
-rw-r--r--source3/nsswitch/winbindd.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c
index 913ad04c6d..17915fb01b 100644
--- a/source3/nsswitch/winbindd.c
+++ b/source3/nsswitch/winbindd.c
@@ -210,18 +210,52 @@ static void winbind_msg_validate_cache(struct messaging_context *msg_ctx,
DATA_BLOB *data)
{
uint8 ret;
+ pid_t child_pid;
+ struct sigaction act;
+ struct sigaction oldact;
DEBUG(10, ("winbindd_msg_validate_cache: got validate-cache "
"message.\n"));
-#if 0
+ /*
+ * call the validation code from a child:
+ * so we don't block the main winbindd and the validation
+ * code can safely use fork/waitpid...
+ */
+ CatchChild();
+ child_pid = sys_fork();
+
+ if (child_pid == -1) {
+ DEBUG(1, ("winbind_msg_validate_cache: Could not fork: %s\n",
+ strerror(errno)));
+ return;
+ }
+
+ if (child_pid != 0) {
+ /* parent */
+ DEBUG(5, ("winbind_msg_validate_cache: child created with "
+ "pid %d.\n", child_pid));
+ return;
+ }
+
+ /* child */
+
+ /* install default SIGCHLD handler: validation code uses fork/waitpid */
+ ZERO_STRUCT(act);
+ act.sa_handler = SIG_DFL;
+#ifdef SA_RESTART
+ /* We *want* SIGALRM to interrupt a system call. */
+ act.sa_flags = SA_RESTART;
+#endif
+ sigemptyset(&act.sa_mask);
+ sigaddset(&act.sa_mask,SIGCHLD);
+ sigaction(SIGCHLD,&act,&oldact);
+
ret = (uint8)winbindd_validate_cache_nobackup();
DEBUG(10, ("winbindd_msg_validata_cache: got return value %d\n", ret));
-#else
- ret = 0;
-#endif
messaging_send_buf(msg_ctx, server_id, MSG_WINBIND_VALIDATE_CACHE, &ret,
(size_t)1);
+ _exit(0);
}
static struct winbindd_dispatch_table {