Minix1.1/usr/src/commands/tee.c

Compare this file to the similar file:
Show the results in this format:

/* tee - pipe fitting		Author: Paul Polderman */

#include "blocksize.h"
#include "signal.h"

#define	MAXFD	18

int fd[MAXFD];

main(argc, argv)
int argc;
char **argv;
{
  char iflag = 0, aflag = 0;
  char buf[BLOCK_SIZE];
  int i, s, n;

  argv++; --argc;
  while (argc > 0 && argv[0][0] == '-') {
	switch (argv[0][1]) {
		case 'i':	/* Interrupt turned off. */
			iflag++;
			break;
		case 'a':	/* Append to outputfile(s),
				 * instead of overwriting them.
				 */
			aflag++;
			break;
		default:
			std_err("Usage: tee [-i] [-a] [files].\n");
			exit(1);
	}
	argv++;
	--argc;
  }
  fd[0] = 1;	/* Always output to stdout. */
  for (s = 1; s < MAXFD && argc > 0; --argc, argv++) {
	if ((fd[s] = open(*argv, 2)) < 0 &&
				(fd[s] = creat(*argv, 0666)) < 0) {
		std_err("Cannot open output file: ");
		std_err(*argv);
		std_err("\n");
		exit(2);
	}
	s++;
  }

  if (iflag)
	signal(SIGINT, SIG_IGN);
  for (i = 1; i < s; i++) {	/* Don't lseek stdout. */
	if (aflag)
		lseek(fd[i], 0L, 2);
  }

  while ((n = read(0, buf, BLOCK_SIZE)) > 0) {
	for (i = 0; i < s; i++)
		write(fd[i], buf, n);
  }

  for (i = 0; i < s; i++)		/* Close all fd's */
	close(fd[i]);
  exit(0);
}