added zrv
This commit is contained in:
parent
8c625bce2a
commit
76bd3399bb
|
@ -0,0 +1,684 @@
|
|||
diff -r 096538d64724 sys/include/libc.h
|
||||
--- a/sys/include/libc.h Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/include/libc.h Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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 096538d64724 sys/src/9/port/auth.c
|
||||
--- a/sys/src/9/port/auth.c Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/auth.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -141,6 +141,7 @@
|
||||
|
||||
renameuser(eve, buf);
|
||||
srvrenameuser(eve, buf);
|
||||
+ zrvrenameuser(eve, buf);
|
||||
shrrenameuser(eve, buf);
|
||||
kstrdup(&eve, buf);
|
||||
procsetuser(buf);
|
||||
diff -r 096538d64724 sys/src/9/port/devroot.c
|
||||
--- a/sys/src/9/port/devroot.c Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/devroot.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -108,6 +108,7 @@
|
||||
addrootdir("root");
|
||||
addrootdir("srv");
|
||||
addrootdir("shr");
|
||||
+ addrootdir("zrv");
|
||||
}
|
||||
|
||||
static Chan*
|
||||
diff -r 096538d64724 sys/src/9/port/devsrv.c
|
||||
--- a/sys/src/9/port/devsrv.c Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/devsrv.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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 096538d64724 sys/src/9/port/devzrv.c
|
||||
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
|
||||
+++ b/sys/src/9/port/devzrv.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -0,0 +1,380 @@
|
||||
+#include "u.h"
|
||||
+#include "../port/lib.h"
|
||||
+#include "mem.h"
|
||||
+#include "dat.h"
|
||||
+#include "fns.h"
|
||||
+#include "../port/error.h"
|
||||
+
|
||||
+static QLock srvlk;
|
||||
+static Srv *srv;
|
||||
+static int qidpath;
|
||||
+
|
||||
+static Srv*
|
||||
+srvlookup(char *name, ulong qidpath)
|
||||
+{
|
||||
+ Srv *sp;
|
||||
+
|
||||
+ for(sp = srv; sp != nil; sp = sp->link) {
|
||||
+ if(sp->path == qidpath || (name != nil && strcmp(sp->name, name) == 0))
|
||||
+ return sp;
|
||||
+ }
|
||||
+ return nil;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+srvgen(Chan *c, char *name, Dirtab*, int, int s, Dir *dp)
|
||||
+{
|
||||
+ Srv *sp;
|
||||
+ Qid q;
|
||||
+
|
||||
+ if(s == DEVDOTDOT){
|
||||
+ devdir(c, c->qid, "#z", 0, eve, 0555, dp);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ qlock(&srvlk);
|
||||
+ if(name != nil)
|
||||
+ sp = srvlookup(name, -1);
|
||||
+ else {
|
||||
+ for(sp = srv; sp != nil && s > 0; sp = sp->link)
|
||||
+ s--;
|
||||
+ }
|
||||
+ if(sp == nil || (name != nil && (strlen(sp->name) >= sizeof(up->genbuf)))) {
|
||||
+ qunlock(&srvlk);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ mkqid(&q, sp->path, 0, QTFILE);
|
||||
+ /* make sure name string continues to exist after we release lock */
|
||||
+ kstrcpy(up->genbuf, sp->name, sizeof up->genbuf);
|
||||
+ devdir(c, q, up->genbuf, 0, sp->owner, sp->perm, dp);
|
||||
+ qunlock(&srvlk);
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+srvinit(void)
|
||||
+{
|
||||
+ qidpath = 1;
|
||||
+}
|
||||
+
|
||||
+static Chan*
|
||||
+srvattach(char *spec)
|
||||
+{
|
||||
+ return devattach('z', spec);
|
||||
+}
|
||||
+
|
||||
+static Walkqid*
|
||||
+srvwalk(Chan *c, Chan *nc, char **name, int nname)
|
||||
+{
|
||||
+ return devwalk(c, nc, name, nname, 0, 0, srvgen);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+srvstat(Chan *c, uchar *db, int n)
|
||||
+{
|
||||
+ return devstat(c, db, n, 0, 0, srvgen);
|
||||
+}
|
||||
+
|
||||
+char*
|
||||
+zrvname(Chan *c)
|
||||
+{
|
||||
+ Srv *sp;
|
||||
+ char *s;
|
||||
+
|
||||
+ s = nil;
|
||||
+ qlock(&srvlk);
|
||||
+ for(sp = srv; sp != nil; sp = sp->link) {
|
||||
+ if(sp->chan == c){
|
||||
+ s = malloc(3+strlen(sp->name)+1);
|
||||
+ if(s != nil)
|
||||
+ sprint(s, "#z/%s", sp->name);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ qunlock(&srvlk);
|
||||
+ return s;
|
||||
+}
|
||||
+
|
||||
+static Chan*
|
||||
+srvopen(Chan *c, int omode)
|
||||
+{
|
||||
+ Srv *sp;
|
||||
+ Chan *nc;
|
||||
+
|
||||
+ if(c->qid.type == QTDIR){
|
||||
+ if(omode & ORCLOSE)
|
||||
+ error(Eperm);
|
||||
+ if(omode != OREAD)
|
||||
+ error(Eisdir);
|
||||
+ c->mode = omode;
|
||||
+ c->flag |= COPEN;
|
||||
+ c->offset = 0;
|
||||
+ return c;
|
||||
+ }
|
||||
+ qlock(&srvlk);
|
||||
+ if(waserror()){
|
||||
+ qunlock(&srvlk);
|
||||
+ nexterror();
|
||||
+ }
|
||||
+
|
||||
+ sp = srvlookup(nil, c->qid.path);
|
||||
+ if(sp == nil || sp->chan == nil)
|
||||
+ error(Eshutdown);
|
||||
+
|
||||
+ if(omode&OTRUNC)
|
||||
+ error(Eexist);
|
||||
+ if(openmode(omode)!=sp->chan->mode && sp->chan->mode!=ORDWR)
|
||||
+ error(Eperm);
|
||||
+ devpermcheck(sp->owner, sp->perm, omode);
|
||||
+
|
||||
+ nc = sp->chan;
|
||||
+ incref(nc);
|
||||
+
|
||||
+ qunlock(&srvlk);
|
||||
+ poperror();
|
||||
+
|
||||
+ cclose(c);
|
||||
+ return nc;
|
||||
+}
|
||||
+
|
||||
+static Chan*
|
||||
+srvcreate(Chan *c, char *name, int omode, ulong perm)
|
||||
+{
|
||||
+ Srv *sp;
|
||||
+
|
||||
+ if(openmode(omode) != OWRITE)
|
||||
+ error(Eperm);
|
||||
+
|
||||
+ if(strlen(name) >= sizeof(up->genbuf))
|
||||
+ error(Etoolong);
|
||||
+
|
||||
+ sp = smalloc(sizeof *sp);
|
||||
+ kstrdup(&sp->name, name);
|
||||
+ kstrdup(&sp->owner, up->user);
|
||||
+
|
||||
+ qlock(&srvlk);
|
||||
+ if(waserror()){
|
||||
+ qunlock(&srvlk);
|
||||
+ free(sp->owner);
|
||||
+ free(sp->name);
|
||||
+ free(sp);
|
||||
+ nexterror();
|
||||
+ }
|
||||
+ if(srvlookup(name, -1) != nil)
|
||||
+ error(Eexist);
|
||||
+
|
||||
+ sp->perm = perm&0777;
|
||||
+ sp->path = qidpath++;
|
||||
+
|
||||
+ c->qid.path = sp->path;
|
||||
+ c->qid.type = QTFILE;
|
||||
+
|
||||
+ sp->link = srv;
|
||||
+ srv = sp;
|
||||
+
|
||||
+ qunlock(&srvlk);
|
||||
+ poperror();
|
||||
+
|
||||
+ c->flag |= COPEN;
|
||||
+ c->mode = OWRITE;
|
||||
+
|
||||
+ return c;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+srvremove(Chan *c)
|
||||
+{
|
||||
+ Srv *sp, **l;
|
||||
+
|
||||
+ if(c->qid.type == QTDIR)
|
||||
+ error(Eperm);
|
||||
+
|
||||
+ qlock(&srvlk);
|
||||
+ if(waserror()){
|
||||
+ qunlock(&srvlk);
|
||||
+ nexterror();
|
||||
+ }
|
||||
+ l = &srv;
|
||||
+ for(sp = *l; sp != nil; sp = *l) {
|
||||
+ if(sp->path == c->qid.path)
|
||||
+ break;
|
||||
+ l = &sp->link;
|
||||
+ }
|
||||
+ if(sp == nil)
|
||||
+ error(Enonexist);
|
||||
+
|
||||
+ /*
|
||||
+ * Only eve can remove system services.
|
||||
+ */
|
||||
+ if(strcmp(sp->owner, eve) == 0 && !iseve())
|
||||
+ error(Eperm);
|
||||
+
|
||||
+ /*
|
||||
+ * No removing personal services.
|
||||
+ */
|
||||
+ if((sp->perm&7) != 7 && strcmp(sp->owner, up->user) && !iseve())
|
||||
+ error(Eperm);
|
||||
+
|
||||
+ *l = sp->link;
|
||||
+ sp->link = nil;
|
||||
+
|
||||
+ qunlock(&srvlk);
|
||||
+ poperror();
|
||||
+
|
||||
+ if(sp->chan != nil)
|
||||
+ cclose(sp->chan);
|
||||
+ free(sp->owner);
|
||||
+ free(sp->name);
|
||||
+ free(sp);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+srvwstat(Chan *c, uchar *dp, int n)
|
||||
+{
|
||||
+ char *strs;
|
||||
+ Srv *sp;
|
||||
+ Dir d;
|
||||
+
|
||||
+ if(c->qid.type & QTDIR)
|
||||
+ error(Eperm);
|
||||
+
|
||||
+ strs = smalloc(n);
|
||||
+ if(waserror()){
|
||||
+ free(strs);
|
||||
+ nexterror();
|
||||
+ }
|
||||
+ n = convM2D(dp, n, &d, strs);
|
||||
+ if(n == 0)
|
||||
+ error(Eshortstat);
|
||||
+
|
||||
+ qlock(&srvlk);
|
||||
+ if(waserror()){
|
||||
+ qunlock(&srvlk);
|
||||
+ nexterror();
|
||||
+ }
|
||||
+
|
||||
+ sp = srvlookup(nil, c->qid.path);
|
||||
+ if(sp == nil)
|
||||
+ error(Enonexist);
|
||||
+
|
||||
+ if(strcmp(sp->owner, up->user) != 0 && !iseve())
|
||||
+ error(Eperm);
|
||||
+
|
||||
+ if(d.name != nil && *d.name && strcmp(sp->name, d.name) != 0) {
|
||||
+ if(strchr(d.name, '/') != nil)
|
||||
+ error(Ebadchar);
|
||||
+ if(strlen(d.name) >= sizeof(up->genbuf))
|
||||
+ error(Etoolong);
|
||||
+ kstrdup(&sp->name, d.name);
|
||||
+ }
|
||||
+ if(d.uid != nil && *d.uid)
|
||||
+ kstrdup(&sp->owner, d.uid);
|
||||
+ if(d.mode != ~0UL)
|
||||
+ sp->perm = d.mode & 0777;
|
||||
+
|
||||
+ qunlock(&srvlk);
|
||||
+ poperror();
|
||||
+
|
||||
+ free(strs);
|
||||
+ poperror();
|
||||
+
|
||||
+ return n;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+srvclose(Chan *c)
|
||||
+{
|
||||
+ /*
|
||||
+ * in theory we need to override any changes in removability
|
||||
+ * since open, but since all that's checked is the owner,
|
||||
+ * which is immutable, all is well.
|
||||
+ */
|
||||
+ if(c->flag & CRCLOSE){
|
||||
+ if(waserror())
|
||||
+ return;
|
||||
+ srvremove(c);
|
||||
+ poperror();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static long
|
||||
+srvread(Chan *c, void *va, long n, vlong)
|
||||
+{
|
||||
+ isdir(c);
|
||||
+ return devdirread(c, va, n, 0, 0, srvgen);
|
||||
+}
|
||||
+
|
||||
+static long
|
||||
+srvwrite(Chan *c, void *va, long n, vlong)
|
||||
+{
|
||||
+ Srv *sp;
|
||||
+ Chan *c1;
|
||||
+ int fd;
|
||||
+ char buf[32];
|
||||
+
|
||||
+ if(n >= sizeof buf)
|
||||
+ error(Etoobig);
|
||||
+ memmove(buf, va, n); /* so we can NUL-terminate */
|
||||
+ buf[n] = 0;
|
||||
+ fd = strtoul(buf, 0, 0);
|
||||
+
|
||||
+ c1 = fdtochan(fd, -1, 0, 1); /* error check and inc ref */
|
||||
+
|
||||
+ qlock(&srvlk);
|
||||
+ if(waserror()) {
|
||||
+ qunlock(&srvlk);
|
||||
+ cclose(c1);
|
||||
+ nexterror();
|
||||
+ }
|
||||
+ if(c1->flag & (CCEXEC|CRCLOSE))
|
||||
+ error("posted fd has remove-on-close or close-on-exec");
|
||||
+ if(c1->qid.type & QTAUTH)
|
||||
+ error("cannot post auth file in zrv");
|
||||
+ sp = srvlookup(nil, c->qid.path);
|
||||
+ if(sp == nil)
|
||||
+ error(Enonexist);
|
||||
+
|
||||
+ if(sp->chan != nil)
|
||||
+ error(Ebadusefd);
|
||||
+
|
||||
+ sp->chan = c1;
|
||||
+
|
||||
+ qunlock(&srvlk);
|
||||
+ poperror();
|
||||
+ return n;
|
||||
+}
|
||||
+
|
||||
+Dev zrvdevtab = {
|
||||
+ 'z',
|
||||
+ "zrv",
|
||||
+
|
||||
+ devreset,
|
||||
+ srvinit,
|
||||
+ devshutdown,
|
||||
+ srvattach,
|
||||
+ srvwalk,
|
||||
+ srvstat,
|
||||
+ srvopen,
|
||||
+ srvcreate,
|
||||
+ srvclose,
|
||||
+ srvread,
|
||||
+ devbread,
|
||||
+ srvwrite,
|
||||
+ devbwrite,
|
||||
+ srvremove,
|
||||
+ srvwstat,
|
||||
+};
|
||||
+
|
||||
+void
|
||||
+zrvrenameuser(char *old, char *new)
|
||||
+{
|
||||
+ Srv *sp;
|
||||
+
|
||||
+ qlock(&srvlk);
|
||||
+ for(sp = srv; sp != nil; sp = sp->link) {
|
||||
+ if(sp->owner != nil && strcmp(old, sp->owner) == 0)
|
||||
+ kstrdup(&sp->owner, new);
|
||||
+ }
|
||||
+ qunlock(&srvlk);
|
||||
+}
|
||||
+
|
||||
diff -r 096538d64724 sys/src/9/port/portdat.h
|
||||
--- a/sys/src/9/port/portdat.h Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/portdat.h Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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 096538d64724 sys/src/9/port/portfns.h
|
||||
--- a/sys/src/9/port/portfns.h Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/portfns.h Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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 096538d64724 sys/src/9/port/proc.c
|
||||
--- a/sys/src/9/port/proc.c Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/proc.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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 096538d64724 sys/src/9/port/sysproc.c
|
||||
--- a/sys/src/9/port/sysproc.c Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/sysproc.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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 096538d64724 sys/src/9/port/userinit.c
|
||||
--- a/sys/src/9/port/userinit.c Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/9/port/userinit.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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 096538d64724 sys/src/cmd/rc/plan9.c
|
||||
--- a/sys/src/cmd/rc/plan9.c Sun Feb 28 16:36:42 2021 -0800
|
||||
+++ b/sys/src/cmd/rc/plan9.c Mon Mar 01 09:28:04 2021 -0800
|
||||
@@ -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;
|
Loading…
Reference in New Issue