Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/libbb/verror_msg.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/libbb/verror_msg.c
r1765 r2725 5 5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> 6 6 * 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. 8 8 */ 9 10 #include <syslog.h>11 9 #include "libbb.h" 10 #if ENABLE_FEATURE_SYSLOG 11 # include <syslog.h> 12 #endif 12 13 13 14 smallint logmode = LOGMODE_STDIO; 14 15 const char *msg_eol = "\n"; 15 16 16 void bb_verror_msg(const char *s, va_list p, const char* strerr)17 void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr) 17 18 { 18 char *msg ;19 char *msg, *msg1; 19 20 int applet_len, strerr_len, msgeol_len, used; 20 21 … … 37 38 strerr_len = strerr ? strlen(strerr) : 0; 38 39 msgeol_len = strlen(msg_eol); 40 /* can't use xrealloc: it calls error_msg on failure, 41 * that may result in a recursion */ 39 42 /* +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; 52 65 } 53 strcpy(&msg[used], msg_eol);54 66 55 67 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); 58 70 } 71 #if ENABLE_FEATURE_SYSLOG 59 72 if (logmode & LOGMODE_SYSLOG) { 60 73 syslog(LOG_ERR, "%s", msg + applet_len); 61 74 } 75 #endif 62 76 free(msg); 63 77 } 64 78 65 66 79 #ifdef VERSION_WITH_WRITEV 67 68 80 /* Code size is approximately the same, but currently it's the only user 69 81 * 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) 82 void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr) 72 83 { 73 84 int strerr_len, msgeol_len; … … 115 126 /*iov[2].iov_base = msgc;*/ 116 127 /*iov[2].iov_len = used;*/ 117 fflush (stdout);118 writev( 2, iov, 3);128 fflush_all(); 129 writev(STDERR_FILENO, iov, 3); 119 130 } 131 # if ENABLE_FEATURE_SYSLOG 120 132 if (logmode & LOGMODE_SYSLOG) { 121 133 syslog(LOG_ERR, "%s", msgc); 122 134 } 135 # endif 123 136 free(msgc); 124 137 } 125 138 #endif 139 140 141 void 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 151 void 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.