diff --git a/dbus/jackdbus.c b/dbus/jackdbus.c index eb86308b..cb9fd14d 100644 --- a/dbus/jackdbus.c +++ b/dbus/jackdbus.c @@ -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