Allow rawon/rawoff during reads (for Plan B). [rsc] --rw-rw-r-- M 431581 glenda sys 22567 Oct 29 16:08 sys/src/9/port/devcons.c /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:25,31 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:25,31 QLock; int raw; /* true if we shouldn't process input */ - int ctl; /* number of opens to the control file */ + Ref ctl; /* number of opens to the control file */ int x; /* index into line */ char line[1024]; /* current input line */ /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:148,153 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:148,156 int m; char *t; + if(!islo()) + usewrite = 0; + /* * how many different output devices do we need? */ /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:408,413 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:411,417 xsummary(); ixsummary(); mallocsummary(); + // memorysummary(); pagersummary(); return; case 'd': /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:564,572 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:568,576 "cputime", {Qcputime}, 6*NUMSIZE, 0444, "drivers", {Qdrivers}, 0, 0444, "hostdomain", {Qhostdomain}, DOMLEN, 0664, - "hostowner", {Qhostowner}, 0, 0664, - "kmesg", {Qkmesg}, 0, 0440, - "kprint", {Qkprint, 0, QTEXCL}, 0, DMEXCL|0440, + "hostowner", {Qhostowner}, 0, 0664, + "kmesg", {Qkmesg}, 0, 0440, + "kprint", {Qkprint, 0, QTEXCL}, 0, DMEXCL|0440, "null", {Qnull}, 0, 0666, "osversion", {Qosversion}, 0, 0444, "pgrpid", {Qpgrpid}, NUMSIZE, 0444, /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:578,584 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:582,588 "sysname", {Qsysname}, 0, 0664, "sysstat", {Qsysstat}, 0, 0666, "time", {Qtime}, NUMSIZE+3*VLNUMSIZE, 0664, - "user", {Quser}, 0, 0666, + "user", {Quser}, 0, 0666, "zero", {Qzero}, 0, 0444, }; /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:648,656 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:652,658 c = devopen(c, omode, consdir, nelem(consdir), devgen); switch((ulong)c->qid.path){ case Qconsctl: - qlock(&kbd); - kbd.ctl++; - qunlock(&kbd); + incref(&kbd.ctl); break; case Qkprint: /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:680,689 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:682,689 /* last close of control file turns off raw */ case Qconsctl: if(c->flag&COPEN){ - qlock(&kbd); - if(--kbd.ctl == 0) + if(decref(&kbd.ctl) == 0) kbd.raw = 0; - qunlock(&kbd); } break; /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:702,715 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:702,715 { ulong l; Mach *mp; - char *b, *bp; + char *b, *bp, ch; char tmp[256]; /* must be >= 18*NUMSIZE (Qswap) */ - char *cbuf = buf; - int ch, i, k, id, eol; + int i, k, id, send; vlong offset = off; if(n <= 0) return n; + switch((ulong)c->qid.path){ case Qdir: return devdirread(c, buf, n, consdir, nelem(consdir), devgen); /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:720,766 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:720,759 qunlock(&kbd); nexterror(); } - if(kbd.raw) { - 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/1029/plan9/sys/src/9/port/devcons.c:932,947 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:925,943 static long conswrite(Chan *c, void *va, long n, vlong off) { - char buf[256]; + char buf[256], ch; long l, bp; - char *a = va; + char *a; Mach *mp; int id, fd; Chan *swc; - ulong offset = off; + ulong offset; Cmdbuf *cb; Cmdtab *ct; + a = va; + offset = off; + switch((ulong)c->qid.path){ case Qcons: /* /n/sourcesdump/2005/1029/plan9/sys/src/9/port/devcons.c:967,982 - /n/sourcesdump/2005/1030/plan9/sys/src/9/port/devcons.c:963,976 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; + /* clumsy hack - wake up reader */ + ch = 0; + qwrite(kbdq, &ch, 1); qunlock(&kbd); } else if(strncmp(a, "rawoff", 6) == 0){ qlock(&kbd); kbd.raw = 0; - kbd.x = 0; qunlock(&kbd); } else if(strncmp(a, "ctlpon", 6) == 0){ kbd.ctlpoff = 0;