#include #include #include #include #include #define MAXBUF 1024 int main() { fd_set rfds; int bufin[MAXBUF], bufout[MAXBUF], c, in, nin, nout, out, startx, y; struct timeval tv; WINDOW *w; w = initscr(); raw(); noecho(); timeout(1); if((in = open("/var/tmp/r.in", O_RDWR)) == -1) err(1, "/var/tmp/r.in"); if((out = open("/var/tmp/r.out", O_RDWR)) == -1) err(1, "/var/tmp/r.out"); tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&rfds); startx = 0; nin = 0; for(;;){ FD_SET(out, &rfds); if(select(out+1, &rfds, NULL, NULL, &tv) > 0){ nout = read(out, bufout, MAXBUF); bufout[nout+1] = 0; printw("%s", bufout); refresh(); startx = -1; } if((c = getch()) != ERR){ if(startx == -1) startx = getcurx(w); if(c == 26) /* ^Z */ break; if(c == 21){ /* ^U */ reset: bufin[0] = nin = 0; y = getcury(w); move(y, startx); refresh(); continue; } bufin[nin++] = c; if(c == '\n'){ bufin[nin] = 0; dprintf(in, "%s", bufin); goto reset; }else{ printw("%c", c); refresh(); } } } echo(); noraw(); endwin(); }