/* tee.c - cat to multiple outputs.
 *
 * Copyright 2008 Rob Landley <rob@landley.net>
 *
 * See http://opengroup.org/onlinepubs/9699919799/utilities/tee.html

USE_TEE(NEWTOY(tee, "ia", TOYFLAG_USR|TOYFLAG_BIN))

config TEE
  bool "tee"
  default y
  help
    usage: tee [-ai] [file...]

    Copy stdin to each listed file, and also to stdout.
    Filename "-" is a synonym for stdout.

    -a	Append to files
    -i	Ignore SIGINT
*/

#define FOR_tee
#include "toys.h"

GLOBALS(
  void *outputs;
)

struct fd_list {
  struct fd_list *next;
  int fd;
};

// Open each output file, saving filehandles to a linked list.

static void do_tee_open(int fd, char *name)
{
  struct fd_list *temp;

  temp = xmalloc(sizeof(struct fd_list));
  temp->next = TT.outputs;
  temp->fd = fd;
  TT.outputs = temp;
}

void tee_main(void)
{
  if (FLAG(i)) xsignal(SIGINT, SIG_IGN);

  // Open output files
  loopfiles_rw(toys.optargs,
    O_RDWR|O_CREAT|WARN_ONLY|(FLAG(a)?O_APPEND:O_TRUNC),
    0666, do_tee_open);

  for (;;) {
    struct fd_list *fdl;
    int len;

    // Read data from stdin
    len = xread(0, toybuf, sizeof(toybuf));
    if (len<1) break;

    // Write data to each output file, plus stdout.
    fdl = TT.outputs;
    for (;;) {
      if(len != writeall(fdl ? fdl->fd : 1, toybuf, len)) toys.exitval=1;
      if (!fdl) break;
      fdl = fdl->next;
    }
  }
}
