view toys/posix/tee.c @ 694:786841fdb1e0

Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style. The actual code should be the same afterward, this is just cosmetic refactoring.
author Rob Landley <>
date Tue, 13 Nov 2012 17:14:08 -0600
parents 7e846e281e38
children c0ef9b7976f0
line wrap: on
line source

/* tee.c - cat to multiple outputs.
 * Copyright 2008 Rob Landley <>
 * See


config TEE
  bool "tee"
  default y
    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"

  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 (toys.optflags & FLAG_i) signal(SIGINT, SIG_IGN);

  // Open output files
    O_RDWR|O_CREAT|((toys.optflags & FLAG_a)?O_APPEND:O_TRUNC),
    0666, 0, 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;