Changeset 1765 in MondoRescue for branches/2.2.5/mindi-busybox/coreutils/tee.c


Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (16 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/coreutils/tee.c

    r821 r1765  
    55 * Copyright (C) 2003  Manuel Novoa III  <mjn3@codepoet.org>
    66 *
    7  * This program is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * This program is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    15  * General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with this program; if not, write to the Free Software
    19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    20  *
     7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
    218 */
    229
     
    2411/* http://www.opengroup.org/onlinepubs/007904975/utilities/tee.html */
    2512
    26 #include <stdio.h>
    27 #include <stdlib.h>
     13#include "libbb.h"
    2814#include <signal.h>
    29 #include <unistd.h>
    30 #include "busybox.h"
    3115
     16int tee_main(int argc, char **argv);
    3217int tee_main(int argc, char **argv)
    3318{
    3419    const char *mode = "w\0a";
    3520    FILE **files;
    36     FILE **p;
    37     char **filenames;
    38     int flags;
    39     int retval = EXIT_SUCCESS;
    40 #ifdef CONFIG_FEATURE_TEE_USE_BLOCK_IO
     21    FILE **fp;
     22    char **names;
     23    char **np;
     24    char retval;
     25#if ENABLE_FEATURE_TEE_USE_BLOCK_IO
    4126    ssize_t c;
    4227# define buf bb_common_bufsiz1
     
    4429    int c;
    4530#endif
     31    retval = getopt32(argv, "ia");  /* 'a' must be 2nd */
     32    argc -= optind;
     33    argv += optind;
    4634
    47     flags = bb_getopt_ulflags(argc, argv, "ia");    /* 'a' must be 2nd */
     35    mode += (retval & 2);   /* Since 'a' is the 2nd option... */
    4836
    49     mode += (flags & 2);    /* Since 'a' is the 2nd option... */
    50 
    51     if (flags & 1) {
    52         signal(SIGINT, SIG_IGN);    /* TODO - switch to sigaction.*/
     37    if (retval & 1) {
     38        signal(SIGINT, SIG_IGN); /* TODO - switch to sigaction. */
    5339    }
    54 
     40    retval = EXIT_SUCCESS;
    5541    /* gnu tee ignores SIGPIPE in case one of the output files is a pipe
    5642     * that doesn't consume all its input.  Good idea... */
    57     signal(SIGPIPE, SIG_IGN);       /* TODO - switch to sigaction.*/
     43    signal(SIGPIPE, SIG_IGN);   /* TODO - switch to sigaction. */
    5844
    5945    /* Allocate an array of FILE *'s, with one extra for a sentinal. */
    60     p = files = (FILE **)xmalloc(sizeof(FILE *) * (argc - optind + 2));
    61     *p = stdout;
    62     argv += optind - 1;
    63     filenames = argv - 1;
    64     *filenames = (char *) bb_msg_standard_input;    /* for later */
     46    fp = files = xzalloc(sizeof(FILE *) * (argc + 2));
     47    np = names = argv - 1;
     48
     49    files[0] = stdout;
    6550    goto GOT_NEW_FILE;
    66 
    6751    do {
    68         if ((*p = bb_wfopen(*argv, mode)) == NULL) {
     52        *fp = fopen_or_warn(*argv, mode);
     53        if (*fp == NULL) {
    6954            retval = EXIT_FAILURE;
    7055            continue;
    7156        }
    72         filenames[(int)(p - files)] = *argv;
    73     GOT_NEW_FILE:
    74         setbuf(*p, NULL);   /* tee must not buffer output. */
    75         ++p;
    76     } while (*++argv);
     57        *np = *argv++;
     58 GOT_NEW_FILE:
     59        setbuf(*fp++, NULL);    /* tee must not buffer output. */
     60        np++;
     61    } while (*argv);
     62    /* names[0] will be filled later */
    7763
    78     *p = NULL;              /* Store the sentinal value. */
    79 
    80 #ifdef CONFIG_FEATURE_TEE_USE_BLOCK_IO
     64#if ENABLE_FEATURE_TEE_USE_BLOCK_IO
    8165    while ((c = safe_read(STDIN_FILENO, buf, BUFSIZ)) > 0) {
    82         for (p=files ; *p ; p++) {
    83             fwrite(buf, 1, c, *p);
    84         }
     66        fp = files;
     67        do
     68            fwrite(buf, 1, c, *fp++);
     69        while (*fp);
    8570    }
    86 
    87     if (c < 0) {            /* Make sure read errors are signaled. */
     71    if (c < 0) {        /* Make sure read errors are signaled. */
    8872        retval = EXIT_FAILURE;
    8973    }
    90 
    9174#else
    9275    setvbuf(stdout, NULL, _IONBF, 0);
    9376    while ((c = getchar()) != EOF) {
    94         for (p=files ; *p ; p++) {
    95             putc(c, *p);
    96         }
     77        fp = files;
     78        do
     79            putc(c, *fp++);
     80        while (*fp);
    9781    }
    9882#endif
     
    10286     * file table is stdout, we can save one "if ferror" test by
    10387     * setting the first entry to stdin and checking stdout error
    104      * status with bb_fflush_stdout_and_exit()... although fflush()ing
     88     * status with fflush_stdout_and_exit()... although fflush()ing
    10589     * is unnecessary here. */
    106 
    107     p = files;
    108     *p = stdin;
    109     do {        /* Now check for (input and) output errors. */
     90    np = names;
     91    fp = files;
     92    names[0] = (char *) bb_msg_standard_input;
     93    files[0] = stdin;
     94    do {    /* Now check for input and output errors. */
    11095        /* Checking ferror should be sufficient, but we may want to fclose.
    11196         * If we do, remember not to close stdin! */
    112         bb_xferror(*p, filenames[(int)(p - files)]);
    113     } while (*++p);
     97        die_if_ferror(*fp++, *np++);
     98    } while (*fp);
    11499
    115     bb_fflush_stdout_and_exit(retval);
     100    fflush_stdout_and_exit(retval);
    116101}
Note: See TracChangeset for help on using the changeset viewer.