M port/devsrv.c => port/devsrv.c +0 -1
@@ 218,7 218,6 @@ srvwrite(Chan *c, void *va, long n, ulong offset)
i = c->qid.path;
if(srv[i].chan != c) /* already been written to */
error(Egreg);
- close(c);
srv[i].chan = c1;
unlock(&srvlk);
poperror();
M port/pgrp.c => port/pgrp.c +2 -0
@@ 177,12 177,14 @@ dupfgrp(Fgrp *f)
new = newfgrp();
+ lock(f);
new->maxfd = f->maxfd;
for(i = 0; i <= f->maxfd; i++)
if(c = f->fd[i]){
incref(c);
new->fd[i] = c;
}
+ unlock(f);
return new;
}
M port/sysfile.c => port/sysfile.c +6 -4
@@ 178,6 178,8 @@ fdclose(int fd, int flag)
f->maxfd = i;
unlock(f);
+ if(c == 0)
+ panic("fdclose");
close(c);
}
@@ 390,7 392,7 @@ bindmount(ulong *arg, int ismount)
ulong flag;
long ret;
char *p;
- int t;
+ int t, fd;
struct{
Chan *chan;
char *spec;
@@ 398,10 400,11 @@ bindmount(ulong *arg, int ismount)
}bogus;
flag = arg[2];
+ fd = arg[0];
if(flag>MMASK || (flag&MORDER)==(MBEFORE|MAFTER))
error(Ebadarg);
if(ismount){
- bogus.chan = fdtochan(arg[0], 2, 0);
+ bogus.chan = fdtochan(fd, 2, 0);
validaddr(arg[3], 1, 0);
if(vmemchr((char*)arg[3], '\0', NAMELEN) == 0)
error(Ebadarg);
@@ 436,8 439,7 @@ bindmount(ulong *arg, int ismount)
poperror();
close(c0);
if(ismount)
- fdclose(arg[0], 0);
-
+ fdclose(fd, 0);
return ret;
}
M port/sysproc.c => port/sysproc.c +7 -6
@@ 85,8 85,12 @@ rfork(ulong flag)
envcpy(p->egrp, oeg);
closeegrp(oeg);
}
- if(flag & RFFDG)
- error(Ebadarg);
+ if(flag & RFFDG) {
+ ofg = p->fgrp;
+ p->fgrp = dupfgrp(ofg);
+ closefgrp(ofg);
+ }
+ else
if(flag & RFCFDG) {
ofg = p->fgrp;
p->fgrp = newfgrp();
@@ 136,7 140,6 @@ rfork(ulong flag)
if(flag & RFFDG)
p->fgrp = dupfgrp(parent->fgrp);
else
- if(flag & RFCFDG)
p->fgrp = newfgrp();
}
else {
@@ 150,8 153,7 @@ rfork(ulong flag)
p->pgrp = newpgrp();
pgrpcpy(p->pgrp, parent->pgrp);
}
- else
- if(flag & RFCNAMEG) {
+ else {
p->pgrp = newpgrp();
*p->pgrp->crypt = *parent->pgrp->crypt;
}
@@ 168,7 170,6 @@ rfork(ulong flag)
envcpy(p->egrp, parent->egrp);
}
else
- if(flag & RFCENVG)
p->egrp = newegrp();
}
else {
M power/main.c => power/main.c +1 -0
@@ 61,6 61,7 @@ main(void)
streaminit();
swapinit();
pageinit();
+print("userinit\n");
userinit();
launchinit();
schedinit();