| @@ -1,6 +1,6 @@ | |||||
| /* -*- Mode: C ; c-basic-offset: 4 -*- */ | /* -*- Mode: C ; c-basic-offset: 4 -*- */ | ||||
| /* | /* | ||||
| Copyright (C) 2007,2008 Nedko Arnaudov | |||||
| Copyright (C) 2007,2008,2010 Nedko Arnaudov | |||||
| Copyright (C) 2007-2008 Juuso Alasuutari | Copyright (C) 2007-2008 Juuso Alasuutari | ||||
| Copyright (C) 2008 Marc-Olivier Barre | Copyright (C) 2008 Marc-Olivier Barre | ||||
| @@ -44,6 +44,8 @@ | |||||
| #include "sigsegv.h" | #include "sigsegv.h" | ||||
| #include "svnversion.h" | #include "svnversion.h" | ||||
| static char * g_log_filename; | |||||
| static ino_t g_log_file_ino; | |||||
| FILE *g_logfile; | FILE *g_logfile; | ||||
| char *g_jackdbus_config_dir; | char *g_jackdbus_config_dir; | ||||
| size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */ | size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */ | ||||
| @@ -550,6 +552,49 @@ fail: | |||||
| jack_error ("Ran out of memory trying to construct method return"); | jack_error ("Ran out of memory trying to construct method return"); | ||||
| } | } | ||||
| static bool jack_dbus_log_open(void) | |||||
| { | |||||
| struct stat st; | |||||
| int ret; | |||||
| int retry; | |||||
| if (g_logfile != NULL) | |||||
| { | |||||
| ret = stat(g_log_filename, &st); | |||||
| if (ret != 0 || g_log_file_ino != st.st_ino) | |||||
| { | |||||
| fclose(g_logfile); | |||||
| } | |||||
| else | |||||
| { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| for (retry = 0; retry < 10; retry++) | |||||
| { | |||||
| g_logfile = fopen(g_log_filename, "a"); | |||||
| if (g_logfile == NULL) | |||||
| { | |||||
| fprintf(stderr, "Cannot open jackdbus log file \"%s\": %d (%s)\n", g_log_filename, errno, strerror(errno)); | |||||
| return false; | |||||
| } | |||||
| ret = stat(g_log_filename, &st); | |||||
| if (ret == 0) | |||||
| { | |||||
| g_log_file_ino = st.st_ino; | |||||
| return true; | |||||
| } | |||||
| fclose(g_logfile); | |||||
| g_logfile = NULL; | |||||
| } | |||||
| fprintf(stderr, "Cannot stat just opened jackdbus log file \"%s\": %d (%s). %d retries\n", g_log_filename, errno, strerror(errno), retry); | |||||
| return false; | |||||
| } | |||||
| void | void | ||||
| jack_dbus_info_callback(const char *msg) | jack_dbus_info_callback(const char *msg) | ||||
| { | { | ||||
| @@ -560,8 +605,11 @@ jack_dbus_info_callback(const char *msg) | |||||
| ctime_r(×tamp, timestamp_str); | ctime_r(×tamp, timestamp_str); | ||||
| timestamp_str[24] = 0; | timestamp_str[24] = 0; | ||||
| fprintf(g_logfile, "%s: %s\n", timestamp_str, msg); | |||||
| fflush(g_logfile); | |||||
| if (jack_dbus_log_open()) | |||||
| { | |||||
| fprintf(g_logfile, "%s: %s\n", timestamp_str, msg); | |||||
| fflush(g_logfile); | |||||
| } | |||||
| } | } | ||||
| #define ANSI_BOLD_ON "\033[1m" | #define ANSI_BOLD_ON "\033[1m" | ||||
| @@ -579,8 +627,11 @@ jack_dbus_error_callback(const char *msg) | |||||
| ctime_r(×tamp, timestamp_str); | ctime_r(×tamp, timestamp_str); | ||||
| timestamp_str[24] = 0; | timestamp_str[24] = 0; | ||||
| fprintf(g_logfile, "%s: " ANSI_BOLD_ON ANSI_COLOR_RED "ERROR: %s" ANSI_RESET "\n", timestamp_str, msg); | |||||
| fflush(g_logfile); | |||||
| if (jack_dbus_log_open()) | |||||
| { | |||||
| fprintf(g_logfile, "%s: " ANSI_BOLD_ON ANSI_COLOR_RED "ERROR: %s" ANSI_RESET "\n", timestamp_str, msg); | |||||
| fflush(g_logfile); | |||||
| } | |||||
| } | } | ||||
| bool | bool | ||||
| @@ -695,42 +746,39 @@ paths_uninit() | |||||
| free(g_jackdbus_log_dir); | free(g_jackdbus_log_dir); | ||||
| } | } | ||||
| int | |||||
| log_init() | |||||
| static bool log_init(void) | |||||
| { | { | ||||
| char *log_filename; | |||||
| size_t log_len; | size_t log_len; | ||||
| log_len = strlen(JACKDBUS_LOG); | log_len = strlen(JACKDBUS_LOG); | ||||
| log_filename = malloc(g_jackdbus_log_dir_len + log_len + 1); | |||||
| if (log_filename == NULL) | |||||
| g_log_filename = malloc(g_jackdbus_log_dir_len + log_len + 1); | |||||
| if (g_log_filename == NULL) | |||||
| { | { | ||||
| fprintf(stderr, "Out of memory\n"); | fprintf(stderr, "Out of memory\n"); | ||||
| return FALSE; | |||||
| return false; | |||||
| } | } | ||||
| memcpy(log_filename, g_jackdbus_log_dir, g_jackdbus_log_dir_len); | |||||
| memcpy(log_filename + g_jackdbus_log_dir_len, JACKDBUS_LOG, log_len); | |||||
| log_filename[g_jackdbus_log_dir_len + log_len] = 0; | |||||
| memcpy(g_log_filename, g_jackdbus_log_dir, g_jackdbus_log_dir_len); | |||||
| memcpy(g_log_filename + g_jackdbus_log_dir_len, JACKDBUS_LOG, log_len); | |||||
| g_log_filename[g_jackdbus_log_dir_len + log_len] = 0; | |||||
| g_logfile = fopen(log_filename, "a"); | |||||
| if (g_logfile == NULL) | |||||
| if (!jack_dbus_log_open()) | |||||
| { | { | ||||
| fprintf(stderr, "Cannot open jackdbus log file \"%s\": %d (%s)\n", log_filename, errno, strerror(errno)); | |||||
| free(log_filename); | |||||
| return FALSE; | |||||
| return false; | |||||
| } | } | ||||
| free(log_filename); | |||||
| return TRUE; | |||||
| return true; | |||||
| } | } | ||||
| void | |||||
| log_uninit() | |||||
| static void log_uninit(void) | |||||
| { | { | ||||
| fclose(g_logfile); | |||||
| if (g_logfile != NULL) | |||||
| { | |||||
| fclose(g_logfile); | |||||
| } | |||||
| free(g_log_filename); | |||||
| } | } | ||||
| void | void | ||||