X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Ftee.c;h=48cc0508fced0d498a6b09fadcd54fa14adf4836;hb=66426760beef7e87c4735f433d123daf911b5b4a;hp=338232ce9e7b9d1e38a5c07d8ef3dd102c279d88;hpb=06af2165288cd6516b89001ec9e24992619230e0;p=oweals%2Fbusybox.git diff --git a/coreutils/tee.c b/coreutils/tee.c index 338232ce9..48cc0508f 100644 --- a/coreutils/tee.c +++ b/coreutils/tee.c @@ -4,16 +4,27 @@ * * Copyright (C) 2003 Manuel Novoa III * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ /* BB_AUDIT SUSv3 compliant */ /* http://www.opengroup.org/onlinepubs/007904975/utilities/tee.html */ -#include "busybox.h" -#include +//usage:#define tee_trivial_usage +//usage: "[-ai] [FILE]..." +//usage:#define tee_full_usage "\n\n" +//usage: "Copy stdin to each FILE, and also to stdout\n" +//usage: "\n -a Append to the given FILEs, don't overwrite" +//usage: "\n -i Ignore interrupt signals (SIGINT)" +//usage: +//usage:#define tee_example_usage +//usage: "$ echo \"Hello\" | tee /tmp/foo\n" +//usage: "$ cat /tmp/foo\n" +//usage: "Hello\n" -int tee_main(int argc, char **argv); +#include "libbb.h" + +int tee_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int tee_main(int argc, char **argv) { const char *mode = "w\0a"; @@ -22,51 +33,57 @@ int tee_main(int argc, char **argv) char **names; char **np; char retval; +//TODO: make unconditional #if ENABLE_FEATURE_TEE_USE_BLOCK_IO ssize_t c; # define buf bb_common_bufsiz1 #else int c; #endif - retval = getopt32(argc, argv, "ia"); /* 'a' must be 2nd */ + retval = getopt32(argv, "ia"); /* 'a' must be 2nd */ argc -= optind; argv += optind; mode += (retval & 2); /* Since 'a' is the 2nd option... */ if (retval & 1) { - signal(SIGINT, SIG_IGN); /* TODO - switch to sigaction. */ + signal(SIGINT, SIG_IGN); /* TODO - switch to sigaction. (why?) */ } retval = EXIT_SUCCESS; /* gnu tee ignores SIGPIPE in case one of the output files is a pipe * that doesn't consume all its input. Good idea... */ - signal(SIGPIPE, SIG_IGN); /* TODO - switch to sigaction. */ + signal(SIGPIPE, SIG_IGN); - /* Allocate an array of FILE *'s, with one extra for a sentinal. */ + /* Allocate an array of FILE *'s, with one extra for a sentinel. */ fp = files = xzalloc(sizeof(FILE *) * (argc + 2)); np = names = argv - 1; files[0] = stdout; goto GOT_NEW_FILE; do { - *fp = fopen_or_warn(*argv, mode); - if (*fp == NULL) { - retval = EXIT_FAILURE; - continue; + *fp = stdout; + if (NOT_LONE_DASH(*argv)) { + *fp = fopen_or_warn(*argv, mode); + if (*fp == NULL) { + retval = EXIT_FAILURE; + argv++; + continue; + } } *np = *argv++; GOT_NEW_FILE: - setbuf(*fp++, NULL); /* tee must not buffer output. */ + setbuf(*fp, NULL); /* tee must not buffer output. */ + fp++; np++; } while (*argv); /* names[0] will be filled later */ #if ENABLE_FEATURE_TEE_USE_BLOCK_IO - while ((c = safe_read(STDIN_FILENO, buf, BUFSIZ)) > 0) { + while ((c = safe_read(STDIN_FILENO, buf, sizeof(buf))) > 0) { fp = files; do - fwrite(buf, 1, c, *fp++); - while (*fp); + fwrite(buf, 1, c, *fp); + while (*++fp); } if (c < 0) { /* Make sure read errors are signaled. */ retval = EXIT_FAILURE; @@ -76,8 +93,8 @@ int tee_main(int argc, char **argv) while ((c = getchar()) != EOF) { fp = files; do - putc(c, *fp++); - while (*fp); + putc(c, *fp); + while (*++fp); } #endif