--- /dev/null
+A crude UNIX tool that performs a bidirectional "cat" between
+stdin/stdout on one side and a file (opened for both reading and
+writing) on the other side. Usually the file is a device.
--- /dev/null
+#include <unistd.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int main (int argc, char **argv) {
+ char buf[20];
+ int fd;
+ int retval;
+ int numread;
+ fd = open(argv[1], O_RDWR);
+ for(;;) {
+ fd_set rfds;
+ struct timeval tv;
+
+ FD_ZERO(&rfds);
+ FD_SET(STDIN_FILENO, &rfds);
+ FD_SET(fd, &rfds);
+
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
+
+ retval = select(fd+1, &rfds, NULL, NULL, &tv);
+
+ if (retval == -1)
+ perror("select()");
+ else if (retval) {
+ if (FD_ISSET(fd, &rfds)) {
+ numread = read(fd, buf, 1);
+ if (numread==0) return;
+ if (numread<0) perror("read()");
+ write(STDOUT_FILENO, buf, numread);
+ } else if (FD_ISSET(STDIN_FILENO, &rfds)) {
+ numread = read(STDIN_FILENO, buf, 1);
+ if (numread==0) return;
+ if (numread<0) perror("read()");
+ write(fd, buf, numread);
+ } else if (FD_ISSET(fd, &rfds)) {
+ perror("huh?\n");
+ }
+ } else {
+ //printf("No data within five seconds.\n");
+ }
+ }
+}