tallow rfork(RFNOTEG|RFPROC|RFFDG) for rc. - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit 1c8efa18ee49ae70138ae4cbc7b9fff5c17a89c8
DIR parent 683c5e534ad7902669f8d92537f9e370380248de
HTML Author: rsc <devnull@localhost>
Date: Thu, 4 Dec 2003 00:17:10 +0000
allow rfork(RFNOTEG|RFPROC|RFFDG) for rc.
Diffstat:
M src/lib9/dirread.c | 8 +++++---
M src/lib9/rfork.c | 14 ++++++++++++++
2 files changed, 19 insertions(+), 3 deletions(-)
---
DIR diff --git a/src/lib9/dirread.c b/src/lib9/dirread.c
t@@ -50,8 +50,7 @@ countde(char *p, int n)
de->d_name[0] = 0;
else if(de->d_name[0]=='.' && de->d_name[1]=='.' && de->d_name[2]==0)
de->d_name[0] = 0;
- else
- m++;
+ m++;
p += de->d_reclen;
}
return m;
t@@ -78,9 +77,12 @@ dirpackage(int fd, char *buf, int n, Dir **dp)
p = buf;
nstr = 0;
+
for(i=0; i<n; i++){
de = (struct dirent*)p;
- if(stat(de->d_name, &st) < 0)
+ if(de->d_name[0] == 0)
+ /* nothing */ {}
+ else if(stat(de->d_name, &st) < 0)
de->d_name[0] = 0;
else
nstr += _p9dir(&st, de->d_name, nil, nil, nil);
DIR diff --git a/src/lib9/rfork.c b/src/lib9/rfork.c
t@@ -4,6 +4,20 @@
int
p9rfork(int flags)
{
+ int pid;
+
+ if((flags&(RFPROC|RFFDG|RFMEM)) == (RFPROC|RFFDG)){
+ /* check other flags before we commit */
+ flags &= ~(RFPROC|RFFDG);
+ if(flags & ~(RFNOTEG)){
+ werrstr("unknown flags %08ux in rfork", flags);
+ return -1;
+ }
+ pid = fork();
+ if(pid != 0)
+ return pid;
+ }
+
if(flags&RFPROC){
werrstr("cannot use rfork to fork -- use ffork");
return -1;