Blame


1 175b8a53 2004-04-21 devnull #include <u.h>
2 175b8a53 2004-04-21 devnull #include <libc.h>
3 175b8a53 2004-04-21 devnull #include "9proc.h"
4 175b8a53 2004-04-21 devnull #undef rfork
5 fd04aace 2003-11-23 devnull
6 fd04aace 2003-11-23 devnull int
7 fd04aace 2003-11-23 devnull p9rfork(int flags)
8 fd04aace 2003-11-23 devnull {
9 1c8efa18 2003-12-04 devnull int pid;
10 1c8efa18 2003-12-04 devnull
11 1c8efa18 2003-12-04 devnull if((flags&(RFPROC|RFFDG|RFMEM)) == (RFPROC|RFFDG)){
12 1c8efa18 2003-12-04 devnull /* check other flags before we commit */
13 1c8efa18 2003-12-04 devnull flags &= ~(RFPROC|RFFDG);
14 32f69c36 2003-12-11 devnull if(flags & ~(RFNOTEG|RFNAMEG)){
15 1c8efa18 2003-12-04 devnull werrstr("unknown flags %08ux in rfork", flags);
16 1c8efa18 2003-12-04 devnull return -1;
17 1c8efa18 2003-12-04 devnull }
18 1c8efa18 2003-12-04 devnull pid = fork();
19 175b8a53 2004-04-21 devnull _p9uproc(0);
20 1c8efa18 2003-12-04 devnull if(pid != 0)
21 1c8efa18 2003-12-04 devnull return pid;
22 1c8efa18 2003-12-04 devnull }
23 fd04aace 2003-11-23 devnull if(flags&RFPROC){
24 32f69c36 2003-12-11 devnull werrstr("cannot use rfork for shared memory -- use ffork");
25 fd04aace 2003-11-23 devnull return -1;
26 fd04aace 2003-11-23 devnull }
27 32f69c36 2003-12-11 devnull if(flags&RFNAMEG){
28 32f69c36 2003-12-11 devnull /* XXX set $NAMESPACE to a new directory */
29 32f69c36 2003-12-11 devnull flags &= ~RFNAMEG;
30 32f69c36 2003-12-11 devnull }
31 fd04aace 2003-11-23 devnull if(flags&RFNOTEG){
32 1c253ceb 2003-11-23 devnull setpgid(0, getpid());
33 fd04aace 2003-11-23 devnull flags &= ~RFNOTEG;
34 fd04aace 2003-11-23 devnull }
35 fd04aace 2003-11-23 devnull if(flags){
36 fd04aace 2003-11-23 devnull werrstr("unknown flags %08ux in rfork", flags);
37 fd04aace 2003-11-23 devnull return -1;
38 fd04aace 2003-11-23 devnull }
39 fd04aace 2003-11-23 devnull return 0;
40 fd04aace 2003-11-23 devnull }