#include <termios.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> static void usage(void) { fputs( "usage:\n" " tool <n>\n" "copies stdin to stdout, and inserts a newline after every byte.\n" "If no character is available on stdin for <n>/10 seconds, a bare newline\n" "is inserted.\n", stderr); exit(42); } static void bumm(void) { perror("tool"); exit(42); } int main(int argc, char *argv[]) { int tenth_seconds; char buf[2]; struct termios tbuf; int red; if (argc != 2) usage(); sscanf(argv[1], "%d", &tenth_seconds); if (tcgetattr(0, &tbuf) < 0) bumm(); /* switch off echo and line-by-line processing */ tbuf.c_lflag &= ~(ICANON | ECHO); /* read will return after reading one byte or waiting <tenth_seconds> Zehntelsekunden. */ tbuf.c_cc[VMIN] = 0; tbuf.c_cc[VTIME] = tenth_seconds; if (tcsetattr(0, TCSAFLUSH, &tbuf) < 0) bumm(); buf[1] = '\n'; while (1) { /* forever */ red = read(0, buf, 1); /* one char from stdin */ if (red == 1) { write(1, buf, 2); /* write char + newline */ } else if (red == 0) { write(1, buf+1, 1); /* a single newline */ } else { bumm(); } } }