funny waitpid behaviour in new vfs module
Jeremy Allison
jra at samba.org
Mon Oct 10 16:45:46 GMT 2005
On Mon, Oct 10, 2005 at 08:28:40PM +0530, Raja Subramanian wrote:
> Hi,
>
> I'm developing a vfs module for samba 3.014a-3 (debian sarge).
>
> On file close/rename, my vfs module tries to validate files by calling
> a user specified validation program. If the validation app fails, I
> simply return EACCES and the validation app takes care of deleting or
> renaming the file.
>
> I've got most of it going, except the validation phase where I have to
> fork/execl and wait for the exit status of the validation app. I'm
> having problems with waitpid().
>
> The offending validate() code is below. waitpid (magic.c line 96)
> bombs randomly with "ECHILD: No child processes". However, my
> validation application (just an empty shell script with "exit 0") is
> always run. If I test validate() outside of samba, it works
> flawlessly.
Samba is eating your signal. Look at the SIGCLD handler in lib/signal.c
static void sig_cld(int signum)
{
while (sys_waitpid((pid_t)-1,(int *)NULL, WNOHANG) > 0)
;
/*
* Turns out it's *really* important not to
* restore the signal handler here if we have real POSIX
* signal handling. If we do, then we get the signal re-delivered
* immediately - hey presto - instant loop ! JRA.
*/
#if !defined(HAVE_SIGACTION)
CatchSignal(SIGCLD, sig_cld);
#endif
}
Look at how this is done in lib/smbrun.c - it temporarily changes
the handler :
CatchChildLeaveStatus();
if ((pid=sys_fork()) < 0) {
... fork exec handling...
while((wpid = sys_waitpid(pid,&status,0)) < 0) {
... pid handling ....
CatchChild(); <---- restores ignore child handling.
You need the same logic in your code.
Jeremy.
More information about the samba-technical
mailing list