Mercurial > ~mikael > mcabber > hg
diff mcabber/mcabber/utils.c @ 1674:f02e7076ccec
Use option guards for tracelog
author | Myhailo Danylenko <isbear@ukrpost.net> |
---|---|
date | Mon, 18 Jan 2010 17:49:30 +0200 |
parents | 41c26b7d2890 |
children | e6e89b1d7831 |
line wrap: on
line diff
--- a/mcabber/mcabber/utils.c Mon Jan 18 16:32:02 2010 +0200 +++ b/mcabber/mcabber/utils.c Mon Jan 18 17:49:30 2010 +0200 @@ -27,6 +27,7 @@ #include <stdlib.h> #include <string.h> #include <stdarg.h> +#include <errno.h> #ifdef HAVE_LIBIDN #include <idna.h> @@ -50,6 +51,7 @@ #include "utils.h" #include "logprint.h" +#include "settings.h" static int DebugEnabled; static char *FName; @@ -153,53 +155,77 @@ return TRUE; } -void ut_InitDebug(int level, const char *filename) +static gboolean tracelog_create(void) { FILE *fp; struct stat buf; int err; - if (level < 1) { - DebugEnabled = 0; - FName = NULL; - return; - } - - if (filename) - FName = expand_filename(filename); - else { - FName = getenv("HOME"); - if (!FName) - FName = g_strdup("/tmp/mcabberlog"); - else { - FName = g_strdup_printf("%s/mcabberlog", FName); - } - } - - DebugEnabled = level; - fp = fopen(FName, "a"); if (!fp) { - fprintf(stderr, "ERROR: Cannot open tracelog file\n"); - return; + scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot open tracelog file: %s!", + strerror(errno)); + return FALSE; } err = fstat(fileno(fp), &buf); if (err || buf.st_uid != geteuid()) { fclose(fp); - DebugEnabled = 0; - FName = NULL; - if (err) { - fprintf(stderr, "ERROR: cannot stat the tracelog file!\n"); - } else { - fprintf(stderr, "ERROR: tracelog file does not belong to you!\n"); - } - return; + if (err) + scr_LogPrint(LPRINT_NORMAL, "ERROR: cannot stat the tracelog file: %s!", + strerror(errno)); + else + scr_LogPrint(LPRINT_NORMAL, "ERROR: tracelog file does not belong to you!"); + return FALSE; } fchmod(fileno(fp), S_IRUSR|S_IWUSR); - fprintf(fp, "New trace log started.\n----------------------\n"); + fputs("New trace log started.\n----------------------\n", fp); fclose(fp); + + return TRUE; +} + +static gchar *tracelog_level_guard(const gchar *key, const gchar *new_value) +{ + int new_level = 0; + if (new_value) + new_level = atoi(new_value); + if (DebugEnabled < 1 && new_level > 0 && FName && !tracelog_create()) + DebugEnabled = 0; + else + DebugEnabled = new_level; + return g_strdup(new_value); +} + +static gchar *tracelog_file_guard(const gchar *key, const gchar *new_value) +{ + gchar *new_fname = NULL; + + if (new_value) + new_fname = expand_filename(new_value); + + if (g_strcmp0(FName, new_fname)) { + g_free(FName); + FName = new_fname; + if (DebugEnabled > 0 && !tracelog_create()) { + g_free(FName); + FName = NULL; + } + } else + g_free(new_fname); + + return g_strdup(new_value); +} + +// ut_InitDebug() +// Installs otpion guards before initial config file parsing. +void ut_InitDebug(void) +{ + DebugEnabled = 0; + FName = NULL; + settings_set_guard("tracelog_level", tracelog_level_guard); + settings_set_guard("tracelog_file", tracelog_file_guard); } void ut_WriteLog(unsigned int flag, const char *data) @@ -210,11 +236,12 @@ ((DebugEnabled == 1) && (flag & LPRINT_LOG))) { FILE *fp = fopen(FName, "a+"); if (!fp) { - scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot open tracelog file"); + scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot open tracelog file: %s.", + strerror(errno)); return; } if (fputs(data, fp) == EOF) - scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot write to tracelog file"); + scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot write to tracelog file."); fclose(fp); } }