about summary refs log tree commit diff stats
path: root/src/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/log.c')
-rw-r--r--src/log.c57
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");
+}