X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=tee.c;h=aa3098c6a580873618e52bdac65966d1482f46b1;hb=201dc0d5a99b8ef765f2b79e6a492a70772a0774;hp=c9b5410d312347d59e200b6497bb5566844d941c;hpb=b610615be9aedfac07d1e01f12575707fa3a227c;p=oweals%2Fbusybox.git diff --git a/tee.c b/tee.c index c9b5410d3..aa3098c6a 100644 --- a/tee.c +++ b/tee.c @@ -2,9 +2,8 @@ /* * Mini tee implementation for busybox * - * - * Copyright (C) 1999,2000 by Lineo, inc. - * Written by John Beppu + * Copyright (C) 1999,2000,2001 by Lineo, inc. + * Written by Matt Kraai * * 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 @@ -22,115 +21,48 @@ * */ -#include "internal.h" -#include +#include "busybox.h" +#include #include -static const char tee_usage[] = - "tee [OPTION]... [FILE]...\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nCopy 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 -#endif -; - - -/* FileList _______________________________________________________________ */ - -#define FL_MAX 1024 -static FILE **FileList; -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) +int +tee_main(int argc, char **argv) { - 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 - default: - usage(tee_usage); - } - } else { + 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); } } - /* init FILE pointers */ - FileList = calloc(FL_MAX, sizeof(FILE*)); - if (!FileList) { - fprintf(stderr, "tee: %s\n", strerror(errno)); - exit(1); - } - 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); - /* Don't bother to close files Exit does that - * automagically, so we can save a few bytes */ - /* free(FileList); */ - return(0); + return status; } -/* $Id: tee.c,v 1.11 2000/06/19 17:25:40 andersen Exp $ */ +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/