changeset 1674:f02e7076ccec

Use option guards for tracelog
author Myhailo Danylenko <isbear@ukrpost.net>
date Mon, 18 Jan 2010 17:49:30 +0200
parents 552da310b83e
children c73b31124fa6
files mcabber/mcabber/main.c mcabber/mcabber/utils.c mcabber/mcabber/utils.h
diffstat 3 files changed, 62 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/main.c	Mon Jan 18 16:32:02 2010 +0200
+++ b/mcabber/mcabber/main.c	Mon Jan 18 17:49:30 2010 +0200
@@ -358,6 +358,7 @@
   caps_init();
   /* Initialize charset */
   scr_InitLocaleCharSet();
+  ut_InitDebug();
 
   /* Parsing config file... */
   ret = cfg_read_file(configFile, TRUE);
@@ -367,10 +368,6 @@
   if (ret == -2)
     exit(EXIT_FAILURE);
 
-  optstring = settings_opt_get("tracelog_file");
-  if (optstring)
-    ut_InitDebug(settings_opt_get_int("tracelog_level"), optstring);
-
   /* If no password is stored, we ask for it before entering
      ncurses mode -- unless the username is unknown. */
   if (settings_opt_get("jid") && !settings_opt_get("password")) {
--- 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);
   }
 }
--- a/mcabber/mcabber/utils.h	Mon Jan 18 16:32:02 2010 +0200
+++ b/mcabber/mcabber/utils.h	Mon Jan 18 17:49:30 2010 +0200
@@ -23,7 +23,7 @@
 void fingerprint_to_hex(const unsigned char *fpr, char hex[49]);
 gboolean hex_to_fingerprint(const char * hex, char fpr[16]);
 
-void ut_InitDebug(int level, const char *file);
+void ut_InitDebug(void);
 void ut_WriteLog(unsigned int flag, const char *data);
 
 char *expand_filename(const char *fname);