On Wed, Oct 26, 2022 at 07:20:20AM +0200, Anton Lindqvist wrote:
> On Tue, Oct 25, 2022 at 10:08:26AM -0600, Mark Kettenis wrote:
> > CVSROOT:    /cvs
> > Module name:        src
> > Changes by: kette...@cvs.openbsd.org        2022/10/25 10:08:26
> > 
> > Modified files:
> >     sys/sys        : siginfo.h wait.h 
> >     sys/kern       : kern_exit.c 
> > 
> > Log message:
> > Implement waitid(2) which is now part of POSIX and used by mozilla.
> > This includes a change of siginfo_r which is technically an ABI break but
> > this should have no real-world impact since the members involved are
> > never touched by the kernel.
> > 
> > ok millert@, deraadt@
> 
> My snapshot build failed today, smells related to this as I have never
> seen this before. Will try to gather more info later today.
> 
>       robsd-exec: waitpid: No child processes

This program used to exit zero:

#include <sys/wait.h>

#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

static int      exitstatus(int);
static int      waiteof(int, int);

int
main(void)
{
        pid_t pid;
        int pip[2];
        int error, status;

        if (pipe2(pip, O_NONBLOCK) == -1)
                err(1, "pipe2");

        pid = fork();
        if (pid == -1)
                err(1, "fork");
        if (pid == 0) {
                close(pip[0]);
                if (setsid() == -1)
                        err(1, "setsid");

                /* Signal to the parent that the process group is present. */
                close(pip[1]);
                _exit(0);
        }

        /* Wait for the process group to become present. */
        close(pip[1]);
        if (waiteof(pip[0], 1000)) {
                warnx("process group failure");
                if (waitpid(pid, &status, 0) == -1)
                        return 1;
                return exitstatus(status);
        }
        close(pip[0]);

        if (waitpid(-pid, &status, 0) == -1)
                err(1, "waitpid");
        error = exitstatus(status);
        if (error)
                warnx("process group exited %d", error);
        return error;
}

static int
exitstatus(int status)
{
        if (WIFEXITED(status))
                return WEXITSTATUS(status);
        if (WIFSIGNALED(status))
                return 128 + WTERMSIG(status);
        return 1;
}

static int
waiteof(int fd, int timoms)
{
        int slpms = 100;

        for (;;) {
                char buf[1];
                ssize_t n;

                n = read(fd, buf, sizeof(buf));
                if (n == -1) {
                        if (errno == EAGAIN) {
                                usleep(slpms * 1000);
                                timoms -= slpms;
                                if (timoms <= 0)
                                        return 1;
                        } else {
                                warn("read");
                                return 1;
                        }
                }
                if (n == 0)
                        break;
        }
        return 0;
}

Reply via email to