int
sys_rfork(struct proc *p, void *v, register_t *retval)
{
struct sys_rfork_args /* {
syscallarg(int) flags;
} */ *uap = v;
int rforkflags;
int flags;
flags = FORK_RFORK;
rforkflags = SCARG(uap, flags);
if ((rforkflags & RFPROC) == 0)
return (EINVAL);
switch(rforkflags & (RFFDG|RFCFDG)) {
case (RFFDG|RFCFDG):
return EINVAL;
case RFCFDG:
flags |= FORK_CLEANFILES;
break;
case RFFDG:
break;
default:
flags |= FORK_SHAREFILES;
break;
}
if (rforkflags & RFNOWAIT)
flags |= FORK_NOZOMBIE;
if (rforkflags & RFMEM)
flags |= FORK_SHAREVM;
#ifdef RTHREADS
if (rforkflags & RFTHREAD)
flags |= FORK_THREAD;
#endif
return (fork1(p, SIGCHLD, flags, NULL, 0, NULL, NULL, retval, NULL));
}