#include #include #include #include #include #include #define MAXBUF 2048 int main() { char bufin[MAXBUF], bufout[MAXBUF], *bi, *bo; fd_set rfds0, rfds1; int c, fdin, fdout, flags, i, nin, nout, state; struct timeval tv; if(!(fdin = open("/var/tmp/r.in", O_WRONLY))) err(1, "open"); if(!(fdout = open("/var/tmp/r.out", O_RDONLY))) err(1, "open"); FD_ZERO(&rfds0); FD_ZERO(&rfds1); tv.tv_sec = 0; tv.tv_usec = 1; for(;;){ /* Read from named pipe (out) and print on standard in. */ FD_SET(fdout, &rfds1); if(select(fdout+1, &rfds1, NULL, NULL, &tv) > 0){ nout = read(fdout, bufout, MAXBUF); if(!nout) continue; bufout[nout] = 0; /* Ignore repetition of typed command. */ for(bi = bufin, bo = bufout;;){ if(*bo == '\n') break; if(*bo == 13){ bo++; continue; } if(*bi != *bo){ printf("%s", bufout); fflush(stdout); break; } bi++; bo++; } bufin[0] = 0; } /* Read from standard in and print on named pipe (in). */ FD_SET(0, &rfds0); if(select(0+1, &rfds0, NULL, NULL, &tv) > 0){ nout = read(0, bufin, MAXBUF); bufin[nout] = 0; dprintf(fdin, "%s", bufin); fflush(stdout); } } }