| @@ -1,6 +1,6 @@ | |||
| /* -*- 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) 2008 Marc-Olivier Barre | |||
| @@ -44,6 +44,8 @@ | |||
| #include "sigsegv.h" | |||
| #include "svnversion.h" | |||
| static char * g_log_filename; | |||
| static ino_t g_log_file_ino; | |||
| FILE *g_logfile; | |||
| char *g_jackdbus_config_dir; | |||
| 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"); | |||
| } | |||
| 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 | |||
| jack_dbus_info_callback(const char *msg) | |||
| { | |||
| @@ -560,8 +605,11 @@ jack_dbus_info_callback(const char *msg) | |||
| ctime_r(×tamp, timestamp_str); | |||
| 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" | |||
| @@ -579,8 +627,11 @@ jack_dbus_error_callback(const char *msg) | |||
| ctime_r(×tamp, timestamp_str); | |||
| 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 | |||
| @@ -695,42 +746,39 @@ paths_uninit() | |||
| free(g_jackdbus_log_dir); | |||
| } | |||
| int | |||
| log_init() | |||
| static bool log_init(void) | |||
| { | |||
| char *log_filename; | |||
| size_t log_len; | |||
| 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"); | |||
| 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 | |||