summaryrefslogtreecommitdiff
path: root/sys/src/9/port/devcons.c
diff options
context:
space:
mode:
authorJacob Moody <moody@posixcafe.org>2022-05-28 02:23:29 +0000
committerJacob Moody <moody@posixcafe.org>2022-05-28 02:23:29 +0000
commite9bb7876e1bd7f9aaef4e1cd0c64c97f411ffde5 (patch)
tree161d07a002c1b9623afff61d72d3d5703a40a252 /sys/src/9/port/devcons.c
parent3351b674802d5a69ddb6d4d0354c0e034804b0c1 (diff)
kernel: add chdev command to devcons
Diffstat (limited to 'sys/src/9/port/devcons.c')
-rw-r--r--sys/src/9/port/devcons.c56
1 files changed, 54 insertions, 2 deletions
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<<i%(sizeof(u64int)*8))
+ continue;
k += snprint(b+k, READSTR-k, "#%C %s\n",
devtab[i]->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);