Fix up a stupid mistake caught by David Whedon <dwhedon@gordian.com>
[oweals/busybox.git] / tee.c
diff --git a/tee.c b/tee.c
index 8d1ca6efd49e7dd21467ecca03776df384ad5258..439cf7dc5ea7569b9cef02a3379ec903c63f1499 100644 (file)
--- a/tee.c
+++ b/tee.c
@@ -1,9 +1,9 @@
+/* vi: set sw=4 ts=4: */
 /*
  * Mini tee implementation for busybox
  *
- *
- * Copyright (C) 1999 by Lineo, inc.
- * Written by John Beppu <beppu@lineo.com>
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
+ * Written by Matt Kraai <kraai@alumni.carnegiemellon.edu>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  */
 
-#include "internal.h"
+#include "busybox.h"
+#include <getopt.h>
 #include <stdio.h>
 
-static const char tee_usage[] =
-    "tee [OPTION]... [FILE]...\n\n"
-    "Copy standard input to each FILE, and also to standard output.\n\n"
-    "Options:\n"
-    "\t-a\tappend to the given FILEs, do not overwrite\n"
-#if 0
-    "\t-i\tignore interrupt signals\n"
-#endif
-    ;
-
-
-/* FileList _______________________________________________________________ */
-
-#define FL_MAX 1024
-static FILE *FileList[FL_MAX];
-static int  FL_end;
-
-typedef void (FL_Function)(FILE *file, char c);
-    
-
-/* apply a function to everything in FileList */
-static void
-FL_apply(FL_Function *f, char c)
-{
-    int i;
-    for (i = 0; i <= FL_end; i++) {
-       f(FileList[i], c);
-    }
-}
-
-/* FL_Function for writing to files*/
-static void
-tee_fwrite(FILE *file, char c)
-{
-    fputc(c, file);
-}
-
-/* FL_Function for closing files */
-static void
-tee_fclose(FILE *file, char c)
-{
-    fclose(file);
-}
-
-/* ________________________________________________________________________ */
-
-/* BusyBoxed tee(1) */
 int
 tee_main(int argc, char **argv)
 {
-    int            i;
-    char    c;
-    char    opt;
-    char    opt_fopen[2] = "w";
-    FILE    *file;
-
-    /* parse argv[] */
-    for (i = 1; i < argc; i++) {
-       if (argv[i][0] == '-') {
-           opt = argv[i][1];
-           switch (opt) {
-               case 'a':
-                   opt_fopen[0] = 'a';
-                   break;
-#if 0
-               case 'i':
-                   fprintf(stderr, "ignore interrupt not implemented\n");
-                   break;
-#endif
+       char *mode = "w";
+       int c, i, status = 0, nfiles = 0;
+       FILE **files;
+
+       while ((c = getopt(argc, argv, "a")) != EOF) {
+               switch (c) {
+               case 'a': 
+                       mode = "a";
+                       break;
                default:
-                   usage(tee_usage);
-           }
-       } else {
-           break;
+                       show_usage();
+               }
        }
-    }
 
-    /* init FILE pointers */
-    FL_end = 0;
-    FileList[0] = stdout;
-    for ( ; i < argc; i++) {
-       /* add a file to FileList */
-       file = fopen(argv[i], opt_fopen);
-       if (!file) { continue; }
-       if (FL_end < FL_MAX) {
-           FileList[++FL_end] = file;
+       files = (FILE **)xmalloc(sizeof(FILE *) * (argc - optind + 1));
+       files[nfiles++] = stdout;
+       while (optind < argc) {
+               if ((files[nfiles++] = fopen(argv[optind++], mode)) == NULL) {
+                       nfiles--;
+                       perror_msg("%s", argv[optind-1]);
+                       status = 1;
+               }
        }
-    }
 
-    /* read and redirect */
-    while ((c = (char) getchar()) && (!feof(stdin))) {
-       FL_apply(tee_fwrite, c);
-    }
+       while ((c = getchar()) != EOF)
+               for (i = 0; i < nfiles; i++)
+                       putc(c, files[i]);
 
-    /* clean up */
-    FL_apply(tee_fclose, 0);
-    exit(0);
+       return status;
 }
 
-/* $Id: tee.c,v 1.4 1999/12/10 08:25:07 andersen Exp $ */
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/