void fromstdin(Conn *c) { int n; char buf[1024]; int pid; int eofs; switch(pid = rfork(RFMEM|RFPROC|RFNOWAIT)){ case -1: error("fork: %r"); case 0: break; default: atexitkill(pid); return; } atexit(atexitkiller); if(interactive) rawon(); notify(cookedcatchint); eofs = 0; for(;;){ n = read(0, buf, sizeof(buf)); if(n < 0){ if(wasintr()){ if(!raw){ buf[0] = 0x7f; n = 1; }else continue; }else break; } if(n == 0){ if(!c->interactive || ++eofs > 32) break; }else eofs = 0; if(interactive && usemenu && n && memchr(buf, 0x1c, n)) { if(menu(c)=='q'){ sendwritemsg(c, "", 0); exits("quit"); } continue; } if(!raw && n==0){ buf[0] = 0x4; n = 1; } sendwritemsg(c, buf, n); } sendwritemsg(c, "", 0); if(n >= 0) /* weren't hung up upon? */ atexitdont(atexitkiller); exits(nil); }
int menu(Biobuf *bp, int net) { char *cp; int done; comm->stopped = 1; rawoff(); fprint(2, ">>> "); for(done = 0; !done; ){ cp = Brdline(bp, '\n'); if(cp == 0){ comm->stopped = 0; return -1; } cp[Blinelen(bp)-1] = 0; switch(*cp){ case '!': system(Bfildes(bp), cp+1); done = 1; break; case '.': done = 1; break; case 'q': comm->stopped = 0; return -1; case 'o': switch(*(cp+1)){ case 'd': send3(net, Iac, Do, atoi(cp+2)); break; case 'w': send3(net, Iac, Will, atoi(cp+2)); break; } break; case 'r': comm->returns = !comm->returns; done = 1; break; case 'i': send2(net, Iac, Interrupt); break; case 'b': send2(net, Iac, Break); break; default: fprint(2, STDHELP); break; } if(!done) fprint(2, ">>> "); } rawon(); comm->stopped = 0; return 0; }
static int menu(Conn *c) { char buf[1024]; int32_t n; int done; int wasraw; wasraw = raw; if(wasraw) rawoff(); buf[0] = '?'; fprint(2, ">>> "); for(done = 0; !done; ){ n = read(0, buf, sizeof(buf)-1); if(n <= 0) return -1; buf[n] = 0; switch(buf[0]){ case '!': print(buf); system(c, buf+1); print("!\n"); done = 1; break; case 'i': buf[0] = 0x1c; sendwritemsg(c, buf, 1); done = 1; break; case '.': case 'q': done = 1; break; case 'r': crstrip = 1-crstrip; done = 1; break; default: fprint(2, STDHELP); break; } if(!done) fprint(2, ">>> "); } if(wasraw) rawon(); else rawoff(); return buf[0]; }
/* * suppress local echo if the remote side is doing it */ int echochange(Biobuf *bp, int cmd) { USED(bp); switch(cmd){ case Will: rawon(); break; case Wont: rawoff(); break; } return 0; }