#include #include #include #include #include #include #include #include "process.h" #include "debug.h" const char red_color[] = { 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x3b, 0x34, 0x30, 0x6d, 0x0, }; const char green_color[] = { 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x32, 0x3b, 0x34, 0x30, 0x6d, 0x0, }; const char normal_color[] = { 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x37, 0x3b, 0x34, 0x30, 0x6d, 0x0, }; int trace_level = TRACE_INFO; static int logfile_fd = STDERR_FILENO; static const char *assign_color(int color) { switch (color) { case 1: return red_color; case 2: return green_color; default: return normal_color; } } void print_trace(const char *file, int line, int color, int l, const char *fmt, ...) { va_list args; time_t t = time(0); char time[32]; char trace[1024]; char all_trace[1538]; char thread_name[16]; const char *color_str = assign_color(color); int ret; if (l > trace_level) return; va_start(args, fmt); vsnprintf(trace, sizeof(trace), fmt, args); va_end(args); strftime(time, sizeof(time), "%d.%m.%Y %T", localtime(&t)); pthread_getname_np(pthread_self(), thread_name, sizeof(thread_name)); ret = snprintf(all_trace, sizeof(all_trace), "%s%s [%s] %s:%d %s %s", color_str, time, thread_name, file, line, normal_color, trace); ret = write(logfile_fd, all_trace, ret); /* * If write failed, well, not much point in trying to print a * trace about it.. So we just ignore the return value */ } int open_log_file(const char *logfile) { int fd; pr_info("Switching logging to file: %s\n", logfile); fd = open(logfile, O_WRONLY | O_CREAT | O_APPEND, 0666); if (fd < 0) { pr_err("Failed to open logfile %s: %m\n", logfile); return fd; } if (logfile_fd != STDERR_FILENO) close(logfile_fd); logfile_fd = fd; pr_info("Opened file %s for logging\n", logfile); return 0; }