r24879: Activate the winbindd cache-validation message handler.
authorMichael Adam <obnox@samba.org>
Sun, 2 Sep 2007 00:32:57 +0000 (00:32 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:30:28 +0000 (12:30 -0500)
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

source/nsswitch/winbindd.c

index 913ad04c6d9fa26947ccf54a7f9923523942490c..17915fb01b1613db9630d2f2691494949c3a2aa3 100644 (file)
@@ -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 {