diff options
| author | Karel Klic <kklic@redhat.com> | 2010-08-19 10:51:22 +0200 |
|---|---|---|
| committer | Karel Klic <kklic@redhat.com> | 2010-08-19 10:51:22 +0200 |
| commit | b858265b75428d5823e9471963985ec52e6019d6 (patch) | |
| tree | 557fc58c2747a4b4ddb175498e4e02aae2dcb5f5 /lib | |
| parent | b4f45ecb8879154afc5bc01544b8f0cac5a472e2 (diff) | |
| download | abrt-b858265b75428d5823e9471963985ec52e6019d6.tar.gz abrt-b858265b75428d5823e9471963985ec52e6019d6.tar.xz abrt-b858265b75428d5823e9471963985ec52e6019d6.zip | |
logging.c needs read_write.h and xfuncs.h -> including them
synchronize variable and function ordering with the header file
fix indentation
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/utils/logging.c | 167 |
1 files changed, 86 insertions, 81 deletions
diff --git a/lib/utils/logging.c b/lib/utils/logging.c index a6eaa50f..1cdb0453 100644 --- a/lib/utils/logging.c +++ b/lib/utils/logging.c @@ -23,121 +23,126 @@ */ #include "logging.h" +#include "read_write.h" +#include "xfuncs.h" -int xfunc_error_retval = EXIT_FAILURE; -int g_verbose; -int logmode = LOGMODE_STDIO; +void (*g_custom_logger)(const char*); const char *msg_prefix = ""; const char *msg_eol = "\n"; -void (*g_custom_logger)(const char*); +int logmode = LOGMODE_STDIO; +int xfunc_error_retval = EXIT_FAILURE; +int g_verbose; void xfunc_die(void) { - exit(xfunc_error_retval); + exit(xfunc_error_retval); } -static void verror_msg_helper(const char *s, va_list p, const char* strerr, int flags) +static void verror_msg_helper(const char *s, + va_list p, + const char* strerr, + int flags) { - char *msg; - int prefix_len, strerr_len, msgeol_len, used; - - if (!logmode) - return; - - used = vasprintf(&msg, s, p); - if (used < 0) - return; - - /* This is ugly and costs +60 bytes compared to multiple - * fprintf's, but is guaranteed to do a single write. - * This is needed for e.g. when multiple children - * can produce log messages simultaneously. */ - - prefix_len = strlen(msg_prefix); - strerr_len = strerr ? strlen(strerr) : 0; - msgeol_len = strlen(msg_eol); - /* +3 is for ": " before strerr and for terminating NUL */ - msg = (char*) xrealloc(msg, prefix_len + used + strerr_len + msgeol_len + 3); - /* TODO: maybe use writev instead of memmoving? Need full_writev? */ - if (prefix_len) { - memmove(msg + prefix_len, msg, used); - used += prefix_len; - memcpy(msg, msg_prefix, prefix_len); - } - if (strerr) { - if (s[0]) { - msg[used++] = ':'; - msg[used++] = ' '; - } - strcpy(&msg[used], strerr); - used += strerr_len; - } - strcpy(&msg[used], msg_eol); - - if (flags & LOGMODE_STDIO) { - fflush(stdout); - full_write(STDERR_FILENO, msg, used + msgeol_len); - } - msg[used] = '\0'; /* remove msg_eol (usually "\n") */ - if (flags & LOGMODE_SYSLOG) { - syslog(LOG_ERR, "%s", msg + prefix_len); - } - if ((flags & LOGMODE_CUSTOM) && g_custom_logger) { - g_custom_logger(msg + prefix_len); - } - free(msg); + char *msg; + int prefix_len, strerr_len, msgeol_len, used; + + if (!logmode) + return; + + used = vasprintf(&msg, s, p); + if (used < 0) + return; + + /* This is ugly and costs +60 bytes compared to multiple + * fprintf's, but is guaranteed to do a single write. + * This is needed for e.g. when multiple children + * can produce log messages simultaneously. */ + + prefix_len = strlen(msg_prefix); + strerr_len = strerr ? strlen(strerr) : 0; + msgeol_len = strlen(msg_eol); + /* +3 is for ": " before strerr and for terminating NUL */ + msg = (char*) xrealloc(msg, prefix_len + used + strerr_len + msgeol_len + 3); + /* TODO: maybe use writev instead of memmoving? Need full_writev? */ + if (prefix_len) { + memmove(msg + prefix_len, msg, used); + used += prefix_len; + memcpy(msg, msg_prefix, prefix_len); + } + if (strerr) { + if (s[0]) { + msg[used++] = ':'; + msg[used++] = ' '; + } + strcpy(&msg[used], strerr); + used += strerr_len; + } + strcpy(&msg[used], msg_eol); + + if (flags & LOGMODE_STDIO) { + fflush(stdout); + full_write(STDERR_FILENO, msg, used + msgeol_len); + } + msg[used] = '\0'; /* remove msg_eol (usually "\n") */ + if (flags & LOGMODE_SYSLOG) { + syslog(LOG_ERR, "%s", msg + prefix_len); + } + if ((flags & LOGMODE_CUSTOM) && g_custom_logger) { + g_custom_logger(msg + prefix_len); + } + free(msg); } void log_msg(const char *s, ...) { - va_list p; + va_list p; - va_start(p, s); - verror_msg_helper(s, p, NULL, logmode); - va_end(p); + va_start(p, s); + verror_msg_helper(s, p, NULL, logmode); + va_end(p); } void error_msg(const char *s, ...) { - va_list p; + va_list p; - va_start(p, s); - verror_msg_helper(s, p, NULL, (logmode | LOGMODE_CUSTOM)); - va_end(p); + va_start(p, s); + verror_msg_helper(s, p, NULL, (logmode | LOGMODE_CUSTOM)); + va_end(p); } void error_msg_and_die(const char *s, ...) { - va_list p; + va_list p; - va_start(p, s); - verror_msg_helper(s, p, NULL, (logmode | LOGMODE_CUSTOM)); - va_end(p); - xfunc_die(); + va_start(p, s); + verror_msg_helper(s, p, NULL, (logmode | LOGMODE_CUSTOM)); + va_end(p); + xfunc_die(); } -void perror_msg_and_die(const char *s, ...) +void perror_msg(const char *s, ...) { - va_list p; + va_list p; - va_start(p, s); - /* Guard against "<error message>: Success" */ - verror_msg_helper(s, p, errno ? strerror(errno) : NULL, (logmode | LOGMODE_CUSTOM)); - va_end(p); - xfunc_die(); + va_start(p, s); + /* Guard against "<error message>: Success" */ + verror_msg_helper(s, p, errno ? strerror(errno) : NULL, (logmode | LOGMODE_CUSTOM)); + va_end(p); } -void perror_msg(const char *s, ...) +void perror_msg_and_die(const char *s, ...) { - va_list p; + va_list p; - va_start(p, s); - /* Guard against "<error message>: Success" */ - verror_msg_helper(s, p, errno ? strerror(errno) : NULL, (logmode | LOGMODE_CUSTOM)); - va_end(p); + va_start(p, s); + /* Guard against "<error message>: Success" */ + verror_msg_helper(s, p, errno ? strerror(errno) : NULL, (logmode | LOGMODE_CUSTOM)); + va_end(p); + xfunc_die(); } void die_out_of_memory(void) { - error_msg_and_die("Out of memory, exiting"); + error_msg_and_die("Out of memory, exiting"); } |
