aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rtty.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/rtty.c b/rtty.c
new file mode 100644
index 0000000..766912f
--- /dev/null
+++ b/rtty.c
@@ -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);
+ }
+ }
+
+}