Allow rawon/rawoff during reads.
[rsc] --rw-rw-r-- M 118305 rsc sys 6806 Nov 12 08:22 sys/src/cmd/vnc/devcons.c
/n/sourcesdump/2005/1112/plan9/sys/src/cmd/vnc/devcons.c:230,236 -
/n/sourcesdump/2005/1113/plan9/sys/src/cmd/vnc/devcons.c:230,236
qunlock(&kbd);
break;
case Qsnarf:
- if(c->mode == OWRITE || c->mode == ORDWR)
+ if((c->mode&3) == OWRITE || (c->mode&3) == ORDWR)
c->aux = smalloc(sizeof(Snarf));
break;
}
/n/sourcesdump/2005/1112/plan9/sys/src/cmd/vnc/devcons.c:289,296 -
/n/sourcesdump/2005/1113/plan9/sys/src/cmd/vnc/devcons.c:289,297
static long
consread(Chan *c, void *buf, long n, vlong off)
{
- char *cbuf;
- int i, ch, eol;
+ char *cbuf, ch;
+ int i, eol;
+ int send;
if(n <= 0)
return n;
/n/sourcesdump/2005/1112/plan9/sys/src/cmd/vnc/devcons.c:315,362 -
/n/sourcesdump/2005/1113/plan9/sys/src/cmd/vnc/devcons.c:316,355
qunlock(&kbd);
nexterror();
}
- if(kbd.raw){
- cbuf = buf;
- if(qcanread(lineq))
- n = qread(lineq, buf, n);
- else {
- /* read as much as possible */
- do {
- i = qread(kbdq, cbuf, n);
- cbuf += i;
- n -= i;
- } while (n>0 && qcanread(kbdq));
- n = cbuf - (char*)buf;
- }
- } else {
- while(!qcanread(lineq)){
- qread(kbdq, &kbd.line[kbd.x], 1);
- ch = kbd.line[kbd.x];
- eol = 0;
+ while(!qcanread(lineq)){
+ qread(kbdq, &ch, 1);
+ send = 0;
+ if(ch == 0){
+ /* flush output on rawoff -> rawon */
+ if(kbd.x > 0)
+ send = !qcanread(kbdq);
+ }else if(kbd.raw){
+ kbd.line[kbd.x++] = ch;
+ send = !qcanread(kbdq);
+ }else{
switch(ch){
case '\b':
- if(kbd.x)
+ if(kbd.x > 0)
kbd.x--;
break;
- case 0x15:
+ case 0x15: /* ^U */
kbd.x = 0;
break;
case '\n':
- case 0x04:
- eol = 1;
+ case 0x04: /* ^D */
+ send = 1;
default:
- kbd.line[kbd.x++] = ch;
+ if(ch != 0x04)
+ kbd.line[kbd.x++] = ch;
break;
}
- if(kbd.x == sizeof(kbd.line) || eol){
- if(ch == 0x04)
- kbd.x--;
- qwrite(lineq, kbd.line, kbd.x);
- kbd.x = 0;
- }
}
- n = qread(lineq, buf, n);
+ if(send || kbd.x == sizeof kbd.line){
+ qwrite(lineq, kbd.line, kbd.x);
+ kbd.x = 0;
+ }
}
+ n = qread(lineq, buf, n);
qunlock(&kbd);
poperror();
return n;
/n/sourcesdump/2005/1112/plan9/sys/src/cmd/vnc/devcons.c:373,378 -
/n/sourcesdump/2005/1113/plan9/sys/src/cmd/vnc/devcons.c:366,372
{
Snarf *t;
char buf[256], *a;
+ char ch;
switch((ulong)c->qid.path){
case Qcons:
/n/sourcesdump/2005/1112/plan9/sys/src/cmd/vnc/devcons.c:386,403 -
/n/sourcesdump/2005/1113/plan9/sys/src/cmd/vnc/devcons.c:380,391
buf[n] = 0;
for(a = buf; a;){
if(strncmp(a, "rawon", 5) == 0){
- qlock(&kbd);
- if(kbd.x){
- qwrite(kbdq, kbd.line, kbd.x);
- kbd.x = 0;
- }
kbd.raw = 1;
- qunlock(&kbd);
+ /* clumsy hack - wake up reader */
+ ch = 0;
+ qwrite(kbdq, &ch, 1);
} else if(strncmp(a, "rawoff", 6) == 0){
- qlock(&kbd);
kbd.raw = 0;
- kbd.x = 0;
- qunlock(&kbd);
}
if(a = strchr(a, ' '))
a++;
|