#include <9pm/u.h>
#include <9pm/libc.h>
#include <9pm/ns.h>
/*
* We only implement the rfork calls that don't have RFPROC.
* Whenever someone calls rfork without RFPROC they ignore
* the return value. Hence, do not fail. Instead, abort.
* (Don't check malloc's return value, etc.)
*/
int
rfork(int flag)
{
int handled;
Fgrp *f, *nf;
Pgrp *g;
Proc *p;
p = getproc();
handled = 0;
if(flag&RFFDG){
if(flag&RFCFDG)
abort();
f = p->fgrp;
nf = dupfgrp(f);
p->fgrp = nf;
closefgrp(f);
handled |= RFFDG;
}
if(flag&RFCFDG){
pm_lock(&p->lk);
f = p->fgrp;
nf = dupfgrp(nil);
p->fgrp = nf;
closefgrp(f);
handled |= RFCFDG;
}
if(flag&(RFNAMEG|RFCNAMEG)){
if((flag&(RFNAMEG|RFCNAMEG))==(RFNAMEG|RFCNAMEG))
abort();
g = p->pgrp;
p->pgrp = newpgrp();
if(flag&RFNAMEG)
pgrpcpy(p->pgrp, g);
p->pgrp->noattach = g->noattach;
closepgrp(g);
handled |= flag&(RFNAMEG|RFCNAMEG);
}
if(flag&RFNOMNT){
p->pgrp->noattach = 1;
handled |= RFNOMNT;
}
handled |= pm_sysrfork(flag);
if(handled != flag){
fprint(2, "pm_rfork: flag=0x%x handled=0x%x\n", flag, handled);
abort();
}
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1