diff -r d1a5cac82bd7 sys/include/libc.h --- a/sys/include/libc.h Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/include/libc.h Tue Jan 05 17:22:13 2021 +0100 @@ -624,6 +624,7 @@ RFPROC = (1<<4), RFMEM = (1<<5), RFNOWAIT = (1<<6), + RFCSRVG = (1<<9), RFCNAMEG = (1<<10), RFCENVG = (1<<11), RFCFDG = (1<<12), diff -r d1a5cac82bd7 sys/lib/dist/cfg/plan9.ini --- a/sys/lib/dist/cfg/plan9.ini Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/lib/dist/cfg/plan9.ini Tue Jan 05 17:22:13 2021 +0100 @@ -3,3 +3,4 @@ mouseport=ask monitor=ask vgasize=ask +bootfile=/amd64/9pc64 diff -r d1a5cac82bd7 sys/src/9/pc64/pc64 --- a/sys/src/9/pc64/pc64 Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/pc64/pc64 Tue Jan 05 17:22:13 2021 +0100 @@ -10,6 +10,7 @@ proc mnt srv + zrv shr dup rtc diff -r d1a5cac82bd7 sys/src/9/port/auth.c --- a/sys/src/9/port/auth.c Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/auth.c Tue Jan 05 17:22:13 2021 +0100 @@ -141,6 +141,7 @@ renameuser(eve, buf); srvrenameuser(eve, buf); + zrvrenameuser(eve, buf); shrrenameuser(eve, buf); kstrdup(&eve, buf); procsetuser(buf); diff -r d1a5cac82bd7 sys/src/9/port/devroot.c --- a/sys/src/9/port/devroot.c Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/devroot.c Tue Jan 05 17:22:13 2021 +0100 @@ -108,6 +108,7 @@ addrootdir("root"); addrootdir("srv"); addrootdir("shr"); + addrootdir("zrv"); } static Chan* diff -r d1a5cac82bd7 sys/src/9/port/devsrv.c --- a/sys/src/9/port/devsrv.c Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/devsrv.c Tue Jan 05 17:22:13 2021 +0100 @@ -6,19 +6,7 @@ #include "../port/error.h" -typedef struct Srv Srv; -struct Srv -{ - char *name; - char *owner; - ulong perm; - Chan *chan; - Srv *link; - ulong path; -}; - static QLock srvlk; -static Srv *srv; static int qidpath; static Srv* @@ -26,7 +14,7 @@ { Srv *sp; - for(sp = srv; sp != nil; sp = sp->link) { + for(sp = up->sgrp->srvgrp; sp != nil; sp = sp->link) { if(sp->path == qidpath || (name != nil && strcmp(sp->name, name) == 0)) return sp; } @@ -48,7 +36,7 @@ if(name != nil) sp = srvlookup(name, -1); else { - for(sp = srv; sp != nil && s > 0; sp = sp->link) + for(sp = up->sgrp->srvgrp; sp != nil && s > 0; sp = sp->link) s--; } if(sp == nil || (name != nil && (strlen(sp->name) >= sizeof(up->genbuf)))) { @@ -95,7 +83,7 @@ s = nil; qlock(&srvlk); - for(sp = srv; sp != nil; sp = sp->link) { + for(sp = up->sgrp->srvgrp; sp != nil; sp = sp->link) { if(sp->chan == c){ s = malloc(3+strlen(sp->name)+1); if(s != nil) @@ -183,8 +171,8 @@ c->qid.path = sp->path; c->qid.type = QTFILE; - sp->link = srv; - srv = sp; + sp->link = up->sgrp->srvgrp; + up->sgrp->srvgrp = sp; qunlock(&srvlk); poperror(); @@ -208,7 +196,7 @@ qunlock(&srvlk); nexterror(); } - l = &srv; + l = &up->sgrp->srvgrp; for(sp = *l; sp != nil; sp = *l) { if(sp->path == c->qid.path) break; @@ -378,12 +366,30 @@ }; void +closesgrp(Sgrp *sg) +{ + Srv *sp; + Srv *tsp; + + if(decref(sg) == 0){ + sp = sg->srvgrp; + while(sp!=nil){ + tsp=sp; + sp=sp->link; + free(tsp); + } + free(sg); + } + return; +} + +void srvrenameuser(char *old, char *new) { Srv *sp; qlock(&srvlk); - for(sp = srv; sp != nil; sp = sp->link) { + for(sp = up->sgrp->srvgrp; sp != nil; sp = sp->link) { if(sp->owner != nil && strcmp(old, sp->owner) == 0) kstrdup(&sp->owner, new); } diff -r d1a5cac82bd7 sys/src/9/port/portdat.h --- a/sys/src/9/port/portdat.h Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/portdat.h Tue Jan 05 17:22:13 2021 +0100 @@ -44,6 +44,8 @@ typedef struct Segment Segment; typedef struct Segio Segio; typedef struct Sema Sema; +typedef struct Sgrp Sgrp; +typedef struct Srv Srv; typedef struct Timer Timer; typedef struct Timers Timers; typedef struct Uart Uart; @@ -468,6 +470,21 @@ Page *pghash[PGHSIZE]; /* page cache */ }; +struct Srv +{ + char *name; + char *owner; + ulong perm; + Chan *chan; + Srv *link; + ulong path; +}; + +struct Sgrp +{ + Ref; + Srv *srvgrp; +}; struct Pgrp { @@ -576,6 +593,7 @@ RFPROC = (1<<4), RFMEM = (1<<5), RFNOWAIT = (1<<6), + RFCSRVG = (1<<9), RFCNAMEG = (1<<10), RFCENVG = (1<<11), RFCFDG = (1<<12), @@ -678,6 +696,7 @@ Egrp *egrp; /* Environment group */ Fgrp *fgrp; /* File descriptor group */ Rgrp *rgrp; /* Rendez group */ + Sgrp *sgrp; /* Srv group */ Fgrp *closingfgrp; /* used during teardown */ diff -r d1a5cac82bd7 sys/src/9/port/portfns.h --- a/sys/src/9/port/portfns.h Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/portfns.h Tue Jan 05 17:22:13 2021 +0100 @@ -34,6 +34,7 @@ void closefgrp(Fgrp*); void closepgrp(Pgrp*); void closergrp(Rgrp*); +void closesgrp(Sgrp*); long clrfpintr(void); void cmderror(Cmdbuf*, char*); int cmount(Chan**, Chan*, int, char*); @@ -340,6 +341,8 @@ void splxpc(int); char* srvname(Chan*); void srvrenameuser(char*, char*); +char* zrvname(Chan*); +void zrvrenameuser(char*, char*); void shrrenameuser(char*, char*); int swapcount(uintptr); int swapfull(void); diff -r d1a5cac82bd7 sys/src/9/port/proc.c --- a/sys/src/9/port/proc.c Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/proc.c Tue Jan 05 17:22:13 2021 +0100 @@ -1092,6 +1092,7 @@ Egrp *egrp; Rgrp *rgrp; Pgrp *pgrp; + Sgrp *sgrp; Chan *dot; void (*pt)(Proc*, int, vlong); @@ -1122,6 +1123,13 @@ closeegrp(egrp); if(rgrp != nil) closergrp(rgrp); + /* sgrp is nilled out here because closefgrp may need srvclose */ + qlock(&up->debug); + sgrp = up->sgrp; + up->sgrp = nil; + qunlock(&up->debug); + if(sgrp != nil) + closesgrp(sgrp); if(dot != nil) cclose(dot); if(pgrp != nil) diff -r d1a5cac82bd7 sys/src/9/port/sysproc.c --- a/sys/src/9/port/sysproc.c Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/sysproc.c Tue Jan 05 17:22:13 2021 +0100 @@ -32,6 +32,7 @@ Pgrp *opg; Rgrp *org; Egrp *oeg; + Sgrp *osg; ulong pid, flag; Mach *wm; @@ -71,6 +72,12 @@ up->rgrp = newrgrp(); closergrp(org); } + if(flag & RFCSRVG) { + osg = up->sgrp; + up->sgrp = smalloc(sizeof(Sgrp)); + up->sgrp->ref = 1; + closesgrp(osg); + } if(flag & (RFENVG|RFCENVG)) { oeg = up->egrp; up->egrp = smalloc(sizeof(Egrp)); @@ -187,6 +194,15 @@ p->rgrp = up->rgrp; } + /* Srv group */ + if(flag & RFCSRVG) { + p->sgrp = smalloc(sizeof(Sgrp)); + p->sgrp->ref = 1; + } else { + p->sgrp = up->sgrp; + incref(p->sgrp); + } + /* Environment group */ if(flag & (RFENVG|RFCENVG)) { p->egrp = smalloc(sizeof(Egrp)); diff -r d1a5cac82bd7 sys/src/9/port/userinit.c --- a/sys/src/9/port/userinit.c Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/9/port/userinit.c Tue Jan 05 17:22:13 2021 +0100 @@ -31,6 +31,8 @@ up->pgrp = newpgrp(); up->egrp = smalloc(sizeof(Egrp)); up->egrp->ref = 1; + up->sgrp = smalloc(sizeof(Sgrp)); + up->sgrp->ref = 1; up->fgrp = dupfgrp(nil); up->rgrp = newrgrp(); diff -r d1a5cac82bd7 sys/src/cmd/rc/plan9.c --- a/sys/src/cmd/rc/plan9.c Tue Jan 05 22:36:03 2021 +1030 +++ b/sys/src/cmd/rc/plan9.c Tue Jan 05 17:22:13 2021 +0100 @@ -81,11 +81,13 @@ arg|=RFFDG; break; case 'F': arg|=RFCFDG; break; + case 'V': + arg|=RFCSRVG; break; } break; default: Usage: - pfmt(err, "Usage: %s [fnesFNEm]\n", runq->argv->words->word); + pfmt(err, "Usage: %s [fnesFNEmV]\n", runq->argv->words->word); setstatus("rfork usage"); poplist(); return;