static void do_log_v(prelude_log_t level, const char *file, const char *function, int line, const char *fmt, va_list ap) { int ret; va_list bkp; char buf[1024]; ssize_t len = 0; if ( global_log_cb == do_log_print || global_log_cb == do_log_syslog ) { len = get_header(level, buf, sizeof(buf)); if ( len < 0 ) return; } PRELUDE_VA_COPY(bkp, ap); ret = vsnprintf(buf + len, sizeof(buf) - len, fmt, ap); if ( ret < 0 || (size_t) ret >= (sizeof(buf) - len) ) goto out; if ( level <= PRELUDE_LOG_ERR || level >= PRELUDE_LOG_DEBUG ) { for ( len += ret; buf[len - 1] == '\n' ; len-- ); snprintf(buf + len, sizeof(buf) - len, " (%s:%d %s)\n", file, line, function); } if ( need_to_log(level, log_level) || need_to_log(level, debug_level) ) { ret = global_log_cb(level, buf); if ( ret < 0 && global_log_cb == do_log_print ) { prelude_log_set_flags(PRELUDE_LOG_FLAGS_SYSLOG); do_log_v(level, file, function, line, fmt, bkp); goto out; } if ( debug_logfile ) fprintf(debug_logfile, "%s", buf); } out: va_end(bkp); }
// TODO: refactor logging code to use a meshlink_handle_t *. void logger(meshlink_handle_t *mesh, meshlink_log_level_t level, const char *format, ...) { if(mesh) { if(level < mesh->log_level || !mesh->log_cb) return; } else { if(level < global_log_level || !global_log_cb) return; } va_list ap; char message[1024] = ""; va_start(ap, format); int len = vsnprintf(message, sizeof message, format, ap); va_end(ap); if(len > 0 && len < sizeof message && message[len - 1] == '\n') message[len - 1] = 0; if(mesh) mesh->log_cb(mesh, level, message); else global_log_cb(NULL, level, message); }