diff options
Diffstat (limited to 'rtty.c')
-rw-r--r-- | rtty.c | 59 |
1 files changed, 59 insertions, 0 deletions
@@ -0,0 +1,59 @@ +#include <err.h> +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <sys/select.h> +#include <unistd.h> + +#define MAXBUF 2048 + +int +main() +{ + char bufin[MAXBUF], bufout[MAXBUF]; + 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"); + + flags = fcntl(0, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(0, F_SETFL, flags); + + 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); + bufout[nout] = 0; + + /* Ignore repetition of typed command. */ + if(strcmp(bufout, bufin) == 0) + bufin[0] = 0; + else{ + printf("%s", bufout); + fflush(stdout); + } + } + + /* 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); + } + } + +} |