svn commit: r302799 - head/usr.bin/mail
Pedro F. Giffuni
pfg at FreeBSD.org
Thu Jul 14 02:25:30 UTC 2016
Author: pfg
Date: Thu Jul 14 02:25:29 2016
New Revision: 302799
URL: https://svnweb.freebsd.org/changeset/base/302799
Log:
mail(1): Bring some fixes from other BSDs.
Fix missing forked job changes from r302776 in wait_child().
Obtained from: NetBSD
Modified:
head/usr.bin/mail/popen.c
Modified: head/usr.bin/mail/popen.c
==============================================================================
--- head/usr.bin/mail/popen.c Thu Jul 14 01:16:07 2016 (r302798)
+++ head/usr.bin/mail/popen.c Thu Jul 14 02:25:29 2016 (r302799)
@@ -362,21 +362,30 @@ int wait_status;
int
wait_child(pid_t pid)
{
- sigset_t nset, oset;
struct child *cp;
+ sigset_t nset, oset;
+ pid_t rv = 0;
(void)sigemptyset(&nset);
(void)sigaddset(&nset, SIGCHLD);
- (void)sigprocmask(SIG_BLOCK, &nset, &oset);
-
+ (void)sigprocmask(SIG_BLOCK, &nset, &oset);
+ /*
+ * If we have not already waited on the pid (via sigchild)
+ * wait on it now. Otherwise, use the wait status stashed
+ * by sigchild.
+ */
cp = findchild(pid, 1);
-
- while (!cp->done)
- (void)sigsuspend(&oset);
- wait_status = cp->status;
- delchild(cp);
+ if (cp == NULL || !cp->done)
+ rv = waitpid(pid, &wait_status, 0);
+ else
+ wait_status = cp->status;
+ if (cp != NULL)
+ delchild(cp);
(void)sigprocmask(SIG_SETMASK, &oset, NULL);
- return ((WIFEXITED(wait_status) && WEXITSTATUS(wait_status)) ? -1 : 0);
+ if (rv == -1 || (WIFEXITED(wait_status) && WEXITSTATUS(wait_status)))
+ return -1;
+ else
+ return 0;
}
/*
More information about the svn-src-head
mailing list