commit 7370b83371a4fe6ff78a90922d95f31d139b730c
parent f28f48b6f9b876b38b2ba079b982202beab797de
Author: Colin Leroy <colin@colino.net>
Date: Thu, 17 Apr 2008 07:03:33 +0000
2008-04-17 [colin] 3.3.1cvs58
* src/common/log.c
Fix log size getting out of control (claws-mail
getting SIGXFSZ): rotate if every 10MB
Diffstat:
4 files changed, 74 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-17 [colin] 3.3.1cvs58
+
+ * src/common/log.c
+ Fix log size getting out of control (claws-mail
+ getting SIGXFSZ): rotate if every 10MB
+
2008-04-10 [paul] 3.3.1cvs57
* src/prefs_other.c
diff --git a/PATCHSETS b/PATCHSETS
@@ -3292,3 +3292,4 @@
( cvs diff -u -r 1.13.2.16 -r 1.13.2.17 src/undo.c; ) > 3.3.1cvs55.patchset
( cvs diff -u -r 1.1.2.23 -r 1.1.2.24 src/prefs_receive.c; ) > 3.3.1cvs56.patchset
( cvs diff -u -r 1.1.2.27 -r 1.1.2.28 src/prefs_other.c; ) > 3.3.1cvs57.patchset
+( cvs diff -u -r 1.6.2.18 -r 1.6.2.19 src/common/log.c; ) > 3.3.1cvs58.patchset
diff --git a/configure.ac b/configure.ac
@@ -11,7 +11,7 @@ MINOR_VERSION=3
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=57
+EXTRA_VERSION=58
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
diff --git a/src/common/log.c b/src/common/log.c
@@ -40,6 +40,16 @@ static FILE *log_fp[LOG_INSTANCE_MAX] = {
NULL
};
+static size_t log_size[LOG_INSTANCE_MAX] = {
+ 0,
+ 0
+};
+
+static gchar *log_filename[LOG_INSTANCE_MAX] = {
+ NULL,
+ NULL
+};
+
typedef struct _LogInstanceData LogInstanceData;
struct _LogInstanceData {
@@ -70,22 +80,37 @@ static gboolean invoke_hook_cb (gpointer data)
void set_log_file(LogInstance instance, const gchar *filename)
{
+ gchar *fullname = NULL;
if (log_fp[instance])
return;
+ if (!g_path_is_absolute(filename)) {
+ fullname = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
+ filename, NULL);
+ } else {
+ fullname = g_strdup(filename);
+ }
/* backup old logfile if existing */
- if (is_file_exist(filename)) {
+ if (is_file_exist(fullname)) {
gchar *backupname;
- backupname = g_strconcat(filename, ".bak", NULL);
- if (rename(filename, backupname) < 0)
- FILE_OP_ERROR(filename, "rename");
+ backupname = g_strconcat(fullname, ".bak", NULL);
+ g_unlink(backupname);
+ if (g_rename(fullname, backupname) < 0)
+ FILE_OP_ERROR(fullname, "rename");
g_free(backupname);
}
- log_fp[instance] = g_fopen(filename, "wb");
- if (!log_fp[instance])
- FILE_OP_ERROR(filename, "fopen");
+ log_fp[instance] = g_fopen(fullname, "wb");
+ if (!log_fp[instance]) {
+ FILE_OP_ERROR(fullname, "fopen");
+ log_filename[instance] = NULL;
+ g_free(fullname);
+ return;
+ }
+ log_filename[instance] = g_strdup(fullname);
+ log_size[instance] = 0;
+ g_free(fullname);
}
void close_log_file(LogInstance instance)
@@ -93,6 +118,20 @@ void close_log_file(LogInstance instance)
if (log_fp[instance]) {
fclose(log_fp[instance]);
log_fp[instance] = NULL;
+ log_size[instance] = 0;
+ g_free(log_filename[instance]);
+ log_filename[instance] = NULL;
+ }
+}
+
+static void rotate_log(LogInstance instance)
+{
+ if (log_size[instance] > 10 * 1024* 1024) {
+ gchar *filename = g_strdup(log_filename[instance]);
+ debug_print("rotating %s\n", filename);
+ close_log_file(instance);
+ set_log_file(instance, filename);
+ g_free(filename);
}
}
@@ -151,7 +190,9 @@ void log_print(LogInstance instance, const gchar *format, ...)
if (log_fp[instance] && prefs_common_enable_log_standard()) {
int r;
r = fputs(buf, log_fp[instance]);
+ log_size[instance] += strlen(buf);
r = fflush(log_fp[instance]);
+ rotate_log(instance);
}
}
@@ -182,8 +223,11 @@ void log_message(LogInstance instance, const gchar *format, ...)
int r;
r = fwrite(buf, 1, LOG_TIME_LEN, log_fp[instance]);
r = fputs("* message: ", log_fp[instance]);
+ log_size[instance] += strlen("* message: ");
r = fputs(buf + LOG_TIME_LEN, log_fp[instance]);
+ log_size[instance] += strlen(buf);
r = fflush(log_fp[instance]);
+ rotate_log(instance);
}
}
@@ -214,8 +258,11 @@ void log_warning(LogInstance instance, const gchar *format, ...)
int r;
r = fwrite(buf, 1, LOG_TIME_LEN, log_fp[instance]);
r = fputs("** warning: ", log_fp[instance]);
+ log_size[instance] += strlen("** warning: ");
r = fputs(buf + LOG_TIME_LEN, log_fp[instance]);
+ log_size[instance] += strlen(buf);
r = fflush(log_fp[instance]);
+ rotate_log(instance);
}
}
@@ -246,8 +293,11 @@ void log_error(LogInstance instance, const gchar *format, ...)
int r;
r = fwrite(buf, 1, LOG_TIME_LEN, log_fp[instance]);
r = fputs("*** error: ", log_fp[instance]);
+ log_size[instance] += strlen("*** error: ");
r = fputs(buf + LOG_TIME_LEN, log_fp[instance]);
+ log_size[instance] += strlen(buf);
r = fflush(log_fp[instance]);
+ rotate_log(instance);
}
}
@@ -278,8 +328,11 @@ void log_status_ok(LogInstance instance, const gchar *format, ...)
int r;
r = fwrite(buf, 1, LOG_TIME_LEN, log_fp[instance]);
r = fputs("* OK: ", log_fp[instance]);
+ log_size[instance] += strlen("* OK: ");
r = fputs(buf + LOG_TIME_LEN, log_fp[instance]);
+ log_size[instance] += strlen(buf);
r = fflush(log_fp[instance]);
+ rotate_log(instance);
}
}
@@ -310,8 +363,11 @@ void log_status_nok(LogInstance instance, const gchar *format, ...)
int r;
r = fwrite(buf, 1, LOG_TIME_LEN, log_fp[instance]);
r = fputs("* NOT OK: ", log_fp[instance]);
+ log_size[instance] += strlen("* NOT OK: ");
r = fputs(buf + LOG_TIME_LEN, log_fp[instance]);
+ log_size[instance] += strlen(buf);
r = fflush(log_fp[instance]);
+ rotate_log(instance);
}
}
@@ -342,7 +398,10 @@ void log_status_skip(LogInstance instance, const gchar *format, ...)
int r;
r = fwrite(buf, 1, LOG_TIME_LEN, log_fp[instance]);
r = fputs("* SKIPPED: ", log_fp[instance]);
+ log_size[instance] += strlen("* SKIPPED: ");
r = fputs(buf + LOG_TIME_LEN, log_fp[instance]);
+ log_size[instance] += strlen(buf);
r = fflush(log_fp[instance]);
+ rotate_log(instance);
}
}