Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/libbb/verror_msg.c

    r1765 r2725  
    55 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
    66 *
    7  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
     7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
    88 */
    9 
    10 #include <syslog.h>
    119#include "libbb.h"
     10#if ENABLE_FEATURE_SYSLOG
     11# include <syslog.h>
     12#endif
    1213
    1314smallint logmode = LOGMODE_STDIO;
    1415const char *msg_eol = "\n";
    1516
    16 void bb_verror_msg(const char *s, va_list p, const char* strerr)
     17void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr)
    1718{
    18     char *msg;
     19    char *msg, *msg1;
    1920    int applet_len, strerr_len, msgeol_len, used;
    2021
     
    3738    strerr_len = strerr ? strlen(strerr) : 0;
    3839    msgeol_len = strlen(msg_eol);
     40    /* can't use xrealloc: it calls error_msg on failure,
     41     * that may result in a recursion */
    3942    /* +3 is for ": " before strerr and for terminating NUL */
    40     msg = xrealloc(msg, applet_len + used + strerr_len + msgeol_len + 3);
    41     /* TODO: maybe use writev instead of memmoving? Need full_writev? */
    42     memmove(msg + applet_len, msg, used);
    43     used += applet_len;
    44     strcpy(msg, applet_name);
    45     msg[applet_len - 2] = ':';
    46     msg[applet_len - 1] = ' ';
    47     if (strerr) {
    48         msg[used++] = ':';
    49         msg[used++] = ' ';
    50         strcpy(&msg[used], strerr);
    51         used += strerr_len;
     43    msg1 = realloc(msg, applet_len + used + strerr_len + msgeol_len + 3);
     44    if (!msg1) {
     45        msg[used++] = '\n'; /* overwrites NUL */
     46        applet_len = 0;
     47    } else {
     48        msg = msg1;
     49        /* TODO: maybe use writev instead of memmoving? Need full_writev? */
     50        memmove(msg + applet_len, msg, used);
     51        used += applet_len;
     52        strcpy(msg, applet_name);
     53        msg[applet_len - 2] = ':';
     54        msg[applet_len - 1] = ' ';
     55        if (strerr) {
     56            if (s[0]) { /* not perror_nomsg? */
     57                msg[used++] = ':';
     58                msg[used++] = ' ';
     59            }
     60            strcpy(&msg[used], strerr);
     61            used += strerr_len;
     62        }
     63        strcpy(&msg[used], msg_eol);
     64        used += msgeol_len;
    5265    }
    53     strcpy(&msg[used], msg_eol);
    5466
    5567    if (logmode & LOGMODE_STDIO) {
    56         fflush(stdout);
    57         full_write(2, msg, used + msgeol_len);
     68        fflush_all();
     69        full_write(STDERR_FILENO, msg, used);
    5870    }
     71#if ENABLE_FEATURE_SYSLOG
    5972    if (logmode & LOGMODE_SYSLOG) {
    6073        syslog(LOG_ERR, "%s", msg + applet_len);
    6174    }
     75#endif
    6276    free(msg);
    6377}
    6478
    65 
    6679#ifdef VERSION_WITH_WRITEV
    67 
    6880/* Code size is approximately the same, but currently it's the only user
    6981 * of writev in entire bbox. __libc_writev in uclibc is ~50 bytes. */
    70 
    71 void bb_verror_msg(const char *s, va_list p, const char* strerr)
     82void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr)
    7283{
    7384    int strerr_len, msgeol_len;
     
    115126        /*iov[2].iov_base = msgc;*/
    116127        /*iov[2].iov_len = used;*/
    117         fflush(stdout);
    118         writev(2, iov, 3);
     128        fflush_all();
     129        writev(STDERR_FILENO, iov, 3);
    119130    }
     131# if ENABLE_FEATURE_SYSLOG
    120132    if (logmode & LOGMODE_SYSLOG) {
    121133        syslog(LOG_ERR, "%s", msgc);
    122134    }
     135# endif
    123136    free(msgc);
    124137}
    125138#endif
     139
     140
     141void FAST_FUNC bb_error_msg_and_die(const char *s, ...)
     142{
     143    va_list p;
     144
     145    va_start(p, s);
     146    bb_verror_msg(s, p, NULL);
     147    va_end(p);
     148    xfunc_die();
     149}
     150
     151void FAST_FUNC bb_error_msg(const char *s, ...)
     152{
     153    va_list p;
     154
     155    va_start(p, s);
     156    bb_verror_msg(s, p, NULL);
     157    va_end(p);
     158}
Note: See TracChangeset for help on using the changeset viewer.