diff options
author | Michael Adam <obnox@samba.org> | 2007-09-02 00:32:57 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:30:28 -0500 |
commit | f9a177772d67a9dad7c34d30dd16d56df9ab8887 (patch) | |
tree | b47959f91cb753b8632846a1bb61b0f3287cdb89 /source3 | |
parent | 60abd094fa8af84a4f0db213143bc262e6b28ff9 (diff) | |
download | samba-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)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/nsswitch/winbindd.c | 42 |
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 { |