#pragma prototyped
#include "proclib.h"
#include <wait.h>
int
procclose(register Proc_t* p)
{
int pid;
int flags = 0;
int status = -1;
if (p)
{
if (p->rfd >= 0)
close(p->rfd);
if (p->wfd >= 0 && p->wfd != p->rfd)
close(p->wfd);
if (p->flags & PROC_ZOMBIE)
{
flags |= WNOHANG;
sleep(1);
}
if (!(p->flags & PROC_FOREGROUND))
sigcritical(SIG_REG_EXEC|SIG_REG_PROC);
while ((pid = waitpid(p->pid, &status, flags)) == -1 && errno == EINTR);
if (pid != p->pid && (flags & WNOHANG))
status = 0;
if (!(p->flags & PROC_FOREGROUND))
sigcritical(0);
else
{
signal(SIGINT, p->sigint);
signal(SIGQUIT, p->sigquit);
#if defined(SIGCHLD)
#if _lib_sigprocmask
sigprocmask(SIG_SETMASK, &p->mask, NiL);
#else
#if _lib_sigsetmask
sigsetmask(p->mask);
#endif
#endif
signal(SIGCHLD, p->sigchld);
#endif
}
status = status == -1 ?
EXIT_QUIT :
WIFSIGNALED(status) ?
EXIT_TERM(WTERMSIG(status)) :
EXIT_CODE(WEXITSTATUS(status));
procfree(p);
}
else
status = errno == ENOENT ? EXIT_NOTFOUND : EXIT_NOEXEC;
return status;
}