talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

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:
MChangeLog | 6++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/common/log.c | 73++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
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); } }