ref: bff4fad52a4c3387db54195c9fc20fb69247c43c
parent: 7327bd43c039d0ce2f4052afac04204718d9e69c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun May 7 15:05:12 EDT 2017
rio: implement writable and truncatable /dev/text
--- a/sys/src/cmd/rio/dat.h
+++ b/sys/src/cmd/rio/dat.h
@@ -68,6 +68,7 @@
Rawoff,
Holdon,
Holdoff,
+ Truncate,
Deleted,
Exited,
};
--- a/sys/src/cmd/rio/fsys.c
+++ b/sys/src/cmd/rio/fsys.c
@@ -32,7 +32,7 @@
{ "mouse", QTFILE, Qmouse, 0600 },
{ "screen", QTFILE, Qscreen, 0400 },
{ "snarf", QTFILE, Qsnarf, 0600 },
- { "text", QTFILE, Qtext, 0400 },
+ { "text", QTFILE, Qtext, 0600 },
{ "wdir", QTFILE, Qwdir, 0600 },
{ "wctl", QTFILE, Qwctl, 0600 },
{ "window", QTFILE, Qwindow, 0400 },
@@ -494,12 +494,14 @@
Fcall t;
int m;
- /* can't truncate anything, so just disregard */
- x->mode &= ~(OTRUNC|OCEXEC);
+ /* can't truncate anything but Qtext, so just disregard */
+ if(FILE(f->qid) != Qtext)
+ x->mode &= ~OTRUNC;
+ x->mode &= ~OCEXEC;
/* can't execute or remove anything */
if(x->mode==OEXEC || (x->mode&ORCLOSE))
goto Deny;
- switch(x->mode){
+ switch(x->mode & ~OTRUNC){
default:
goto Deny;
case OREAD:
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -1198,6 +1198,9 @@
wrepaint(w);
flushimage(display, 1);
break;
+ case Truncate:
+ wdelete(w, 0, w->nr);
+ break;
case Deleted:
wclunk(w);
if(w->notefd >= 0)
--- a/sys/src/cmd/rio/xfid.c
+++ b/sys/src/cmd/rio/xfid.c
@@ -250,6 +250,10 @@
return;
}
switch(FILE(x->f->qid)){
+ case Qtext:
+ if(x->mode&OTRUNC)
+ wsendctlmesg(w, Truncate, ZR, nil);
+ break;
case Qconsctl:
if(w->ctlopen){
filsysrespond(x->fs, x, &t, Einuse);
@@ -386,6 +390,7 @@
x->data[cnt] = 0;
switch(qid){
case Qcons:
+ case Qtext:
alts[CWdata].c = w->conswrite;
alts[CWdata].v = &cwm;
alts[CWdata].op = CHANRCV;