From da8f42cbad2a0c93c8340dd4cf4a86a78d885fe8 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 7 Jun 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-06-07 --- port/devsrv.c | 1 - port/pgrp.c | 2 ++ port/sysfile.c | 10 ++++++---- port/sysproc.c | 13 +++++++------ power/main.c | 1 + 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/port/devsrv.c b/port/devsrv.c index a91bfdffde313355ff353b9b435565165f4adb7c..3185daa7d25df97a04c7b359a72599ebb900741c 100644 --- a/port/devsrv.c +++ b/port/devsrv.c @@ -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(); diff --git a/port/pgrp.c b/port/pgrp.c index 9ebdda50b120f98319f5f26b690e636e65db12b5..eb7f90f0aec0d49fc9185f29de8db434a14cb94d 100644 --- a/port/pgrp.c +++ b/port/pgrp.c @@ -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; } diff --git a/port/sysfile.c b/port/sysfile.c index dcb3a04561656a1f0d16fe0ee5d9fc237230f16d..82968fe73279317423f1370612196b6357fd7dc9 100644 --- a/port/sysfile.c +++ b/port/sysfile.c @@ -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; } diff --git a/port/sysproc.c b/port/sysproc.c index 3c6ba5098f1972727ddf486eff46aa2f03b73dcb..4481d593d1b36f950184218fe571391c737f9dac 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -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 { diff --git a/power/main.c b/power/main.c index 6ce6b0b336363406f6ad434c096d6754100ce49f..772836a13262440b65d616584eaafe6ba4e18cc3 100644 --- a/power/main.c +++ b/power/main.c @@ -61,6 +61,7 @@ main(void) streaminit(); swapinit(); pageinit(); +print("userinit\n"); userinit(); launchinit(); schedinit();