diff options
Diffstat (limited to 'src/log.c')
-rw-r--r-- | src/log.c | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/src/log.c b/src/log.c index 5265e247..e1cbddb7 100644 --- a/src/log.c +++ b/src/log.c @@ -22,20 +22,32 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> #include "glib.h" #include "common.h" #include "log.h" +#include "preferences.h" #define PROF "prof" +#ifdef _WIN32 +// replace 'struct stat' and 'stat()' for windows +#define stat _stat +#endif + static FILE *logp; static GTimeZone *tz; static GDateTime *dt; static log_level_t level_filter; +static GString *_get_log_file(void); +static void _rotate_log_file(void); + void log_debug(const char * const msg, ...) { @@ -89,10 +101,7 @@ log_init(log_level_t filter) { level_filter = filter; tz = g_time_zone_new_local(); - GString *log_file = g_string_new(getenv("HOME")); - g_string_append(log_file, "/.profanity/log"); - create_dir(log_file->str); - g_string_append(log_file, "/profanity.log"); + GString *log_file = _get_log_file(); logp = fopen(log_file->str, "a"); g_string_free(log_file, TRUE); } @@ -114,6 +123,9 @@ void log_msg(log_level_t level, const char * const area, const char * const msg) { if (level >= level_filter) { + struct stat st; + int result; + GString *log_file = _get_log_file(); dt = g_date_time_new_now(tz); gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S"); @@ -122,6 +134,43 @@ log_msg(log_level_t level, const char * const area, const char * const msg) fflush(logp); g_free(date_fmt); + + result = stat(log_file->str, &st); + if (result == 0 && st.st_size >= prefs_get_max_log_size()) { + _rotate_log_file(); + } + + g_string_free(log_file, TRUE); } } +static GString * +_get_log_file(void) +{ + GString *log_file = g_string_new(getenv("HOME")); + g_string_append(log_file, "/.profanity/log"); + create_dir(log_file->str); + g_string_append(log_file, "/profanity.log"); + + return log_file; +} +static void +_rotate_log_file(void) +{ + GString *log_file = _get_log_file(); + size_t len = strlen(log_file->str); + char *log_file_new = malloc(len + 3); + + strncpy(log_file_new, log_file->str, len); + log_file_new[len] = '.'; + log_file_new[len+1] = '1'; + log_file_new[len+2] = 0; + + log_close(); + rename(log_file->str, log_file_new); + log_init(log_get_filter()); + + free(log_file_new); + g_string_free(log_file, TRUE); + log_info("Log has been rotated"); +} |