Applies the rawon/rawoff fix to vncs. I used the code from 9/port/devcons.c, which works perfectly and can be understood :-) Reference: /n/sources/patch/applied/rawfix Date: Fri Nov 11 09:07:32 CET 2005 --- /sys/src/cmd/vnc/devcons.c Fri Nov 11 09:06:50 2005 +++ /sys/src/cmd/vnc/devcons.c Fri Nov 11 09:06:47 2005 @@ -230,7 +230,7 @@ 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; } @@ -289,8 +289,9 @@ 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; @@ -315,48 +316,40 @@ 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; @@ -373,6 +366,7 @@ { Snarf *t; char buf[256], *a; + char ch; switch((ulong)c->qid.path){ case Qcons: @@ -386,18 +380,12 @@ 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++;