From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 25214 invoked from network); 6 Jan 2021 10:42:42 -0000 Received: from 1ess.inri.net (216.126.196.35) by inbox.vuxu.org with ESMTPUTF8; 6 Jan 2021 10:42:42 -0000 Received: from oat.nine.sirjofri.de ([5.45.105.127]) by 1ess; Wed Jan 6 05:17:16 -0500 2021 Message-ID: To: 9front@9front.org Date: Wed, 06 Jan 2021 11:17:04 +0100 From: sirjofri+ml-9front@sirjofri.de MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="upas-sybbvjtdyzftbjneaewthcaygw" List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: responsive leveraged strategy Subject: [9front] mycroftiv's zrv and rfork V, patch for current 9front Reply-To: 9front@9front.org Precedence: bulk This is a multi-part message in MIME format. --upas-sybbvjtdyzftbjneaewthcaygw Content-Disposition: inline Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Hello all, since some people asked mycroftiv about rfork V (and zrv) here's a patch for current (yesterday) 9front. Some things changed since the last official ants diffs, so manual adjustments were needed. Also don't forget backups! The patch should apply cleanly. Rebuilding libc, rc and kernel is needed (libc before rc!). This patch does _not_ include the changes to postmountsrv, which make it possible to srv directly to /zrv (`application -s name` vs `application -s /zrv/name`). All credits go to mycroftiv for this. sirjofri . --upas-sybbvjtdyzftbjneaewthcaygw Content-Disposition: inline Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit 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; --upas-sybbvjtdyzftbjneaewthcaygw--