4 * Process-related system support
10 typedef struct ProcStor {
20 * Count includes NULL terminator. Returns allocated array.
24 argvcheck(PointerStor *psp, size_t *countp)
30 if (psp->s_Addr == NULL)
33 BOUNDSCHECK(psp, sizeof(PointerStor));
35 for (ps = (void *)psp->s_Addr; (void *)ps < (void *)psp->s_End; ++ps) {
37 if (ps->s_Addr == NULL)
40 if ((void *)ps == (void *)psp->s_End)
41 dpanic("char **array not NULL terminated");
44 av = zalloc(sizeof(char **) * count);
46 for (ps = (void *)psp->s_Addr; (void *)ps < (void *)psp->s_End; ++ps) {
47 if (ps->s_Addr == NULL)
49 STRBOUNDSCHECK(ps, 0x3FFFFFFF);
50 av[count] = strdup(ps->s_Addr);
65 for (count = 0; av[count]; ++count)
68 zfree(av, sizeof(char **) * count);
86 extern char **environ;
89 RuneSysCall_fexec(struct fexec_args *args, int *rval)
91 ProcStor *proc = args->lvs.s_Addr;
98 STRBOUNDSCHECK(&args->path, 0x3FFFFFFF);
99 av = argvcheck(&args->argv, &asize);
100 envp = argvcheck(&args->envp, &esize);
101 if ((pid = vfork()) == 0) {
108 fcntl(0, F_SETFD, 0);
109 fcntl(1, F_SETFD, 0);
110 fcntl(2, F_SETFD, 0);
114 execve(args->path.s_Addr, av, envp);
119 if (sizeof(pid) < sizeof(runepid_t))
120 proc->pid = (runepid_t)(int)pid;
140 RuneSysCall_fwait(struct fwait_args *args, int *rval)
142 ProcStor *proc = args->lvs.s_Addr;
148 pid = wait4(proc->pid, &status, WNOHANG, NULL);
152 if (errno != EAGAIN) {
160 threadWaitEvent(proc->pid, THWAIT_PROC);
165 proc->xcode = WEXITSTATUS(status);
176 RuneSysCall_fwaitn(struct fwaitn_args *args, int *rval)
178 ProcStor *proc = args->lvs.s_Addr;
183 pid = wait4(proc->pid, &status, WNOHANG, NULL);
192 proc->error = EAGAIN;
198 proc->xcode = WEXITSTATUS(status);