From e9bb7876e1bd7f9aaef4e1cd0c64c97f411ffde5 Mon Sep 17 00:00:00 2001 From: Jacob Moody Date: Sat, 28 May 2022 02:23:29 +0000 Subject: kernel: add chdev command to devcons --- sys/src/9/port/devcons.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'sys/src/9/port/devcons.c') diff --git a/sys/src/9/port/devcons.c b/sys/src/9/port/devcons.c index eb60d411e..756a47936 100644 --- a/sys/src/9/port/devcons.c +++ b/sys/src/9/port/devcons.c @@ -39,6 +39,16 @@ Cmdtab rebootmsg[] = CMrdb, "rdb", 0, }; +enum +{ + CMchdev, +}; + +Cmdtab drivermsg[] = +{ + CMchdev, "chdev", 0, +}; + void printinit(void) { @@ -332,7 +342,7 @@ static Dirtab consdir[]={ "cons", {Qcons}, 0, 0660, "consctl", {Qconsctl}, 0, 0220, "cputime", {Qcputime}, 6*NUMSIZE, 0444, - "drivers", {Qdrivers}, 0, 0444, + "drivers", {Qdrivers}, 0, 0666, "hostdomain", {Qhostdomain}, DOMLEN, 0664, "hostowner", {Qhostowner}, 0, 0664, "kmesg", {Qkmesg}, 0, 0440, @@ -583,9 +593,15 @@ consread(Chan *c, void *buf, long n, vlong off) case Qdrivers: b = smalloc(READSTR); k = 0; - for(i = 0; devtab[i] != nil; i++) + + rlock(&up->pgrp->ns); + for(i = 0; devtab[i] != nil; i++){ + if(up->pgrp->notallowed[i/(sizeof(u64int)*8)] & 1<dc, devtab[i]->name); + } + runlock(&up->pgrp->ns); if(waserror()){ free(b); nexterror(); @@ -620,6 +636,7 @@ conswrite(Chan *c, void *va, long n, vlong off) { char buf[256]; long l, bp; + int invert; char *a; Mach *mp; int id; @@ -676,6 +693,41 @@ conswrite(Chan *c, void *va, long n, vlong off) error(Eperm); break; + case Qdrivers: + cb = parsecmd(a, n); + if(waserror()) { + free(cb); + nexterror(); + } + + ct = lookupcmd(cb, drivermsg, nelem(drivermsg)); + if(ct == nil) + error(Ebadarg); + if(ct->index != CMchdev) + error(Ebadarg); + if(cb->nf < 2 || cb->nf > 3) + error(Ebadarg); + + invert = 1; + a = cb->f[2]; + switch(cb->f[1][0]){ + case '&': + if(cb->f[1][1] == '~') + invert--; + break; + case '~': + a = ""; + break; + default: + error(Ebadarg); + break; + } + + devmask(up->pgrp, invert, a); + poperror(); + free(cb); + break; + case Qreboot: if(!iseve()) error(Eperm); -- cgit v1.2.3