4 * Process-related system support
10 typedef struct ProcStor {
32 extern char **environ;
35 RUNESYSCALL(exec) (struct exec_args *args, int *rval)
37 ProcStor *proc = args->lvs.lv_Addr;
45 if ((pid = vfork()) == 0) {
51 fd1 = fcntl(fd1, F_DUPFD_CLOEXEC, 10);
52 if (fd2 == 0 || fd2 == 1)
53 fd2 = fcntl(fd2, F_DUPFD_CLOEXEC, 10);
57 else if (args->fd0 != 0)
70 fcntl(0, F_SETFD, 0); /* ignore error */
71 fcntl(1, F_SETFD, 0); /* ignore error */
72 fcntl(2, F_SETFD, 0); /* ignore error */
74 myenvp = (envp ? envp : environ);
75 execve(args->path, av, myenvp);
78 if (sizeof(pid) < sizeof(runepid_t))
79 proc->pid = (runepid_t)(int)pid;
99 RUNESYSCALL(wait) (struct wait_args *args, int *rval)
101 ProcStor *proc = args->lvs.lv_Addr;
107 pid = wait4(proc->pid, &status, WNOHANG, NULL);
111 if (errno != EAGAIN) {
119 threadWaitEvent(proc->pid, THWAIT_PROC);
124 proc->xcode = WEXITSTATUS(status);
135 RUNESYSCALL(waitn) (struct waitn_args *args, int *rval)
137 ProcStor *proc = args->lvs.lv_Addr;
142 pid = wait4(proc->pid, &status, WNOHANG, NULL);
151 proc->error = EAGAIN;
157 proc->xcode = WEXITSTATUS(status);