#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>

#include <sys/select.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

char buffer[8192];

int show_data(int fd, char* name) {
  int nbytes = read(fd, buffer, 8192);
  switch(nbytes) {
  case -1:
    fprintf(stderr, "read of %s failed: %s\n", name, strerror(errno));
    exit(errno);
  case 0:
    fprintf(stderr, "EOF on %s\n", name);
    return nbytes;
  default:
    fprintf(stdout, "from %s: %*.*s\n", name, nbytes, nbytes, buffer);
    return nbytes; }}


int main(int c, char** v) {
  fd_set in;
  int tty = 0;
  int done = 0;

  if(c < 2) {
    fprintf(stderr, "usage: dcu <tty>\n");
    return -1; }

  tty = open(v[1], O_RDWR);
  if(tty < 0) {
    fprintf(stderr, "opening %s: %s\n", v[1], strerror(errno));
    return -2; }
  
  while(!done) {
    int ready = 0;

    FD_ZERO(&in);
    FD_SET(0, &in);
    FD_SET(tty, &in);

    ready = select(2, &in, NULL, NULL, NULL);
    switch(ready) {
    case -1:
      fprintf(stderr, "select failed: %s\n", strerror(errno));
      return errno;
    case 0:
      continue;
    default: {
      if(FD_ISSET(tty, &in)) done = show_data(tty, v[1]);
      else if(FD_ISSET(0, &in)) {
	done = show_data(0, "stdin");
	if(!done) write(tty, buffer, done); }
      else
	fprintf(stderr, "No fds appear to be ready...strange\n"); }}}

  return 0; }
