Blame


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