Ensure available fallback folder for NewMail log
authorRicardo Mones <ricardo@mones.org>
Wed, 3 Apr 2013 23:31:57 +0000 (01:31 +0200)
committerRicardo Mones <ricardo@mones.org>
Thu, 4 Apr 2013 23:13:37 +0000 (01:13 +0200)
Fixes bug #2859 "Newmail plugin doesn't work if Mail folder
not present when it is loaded."

Also included:
 * Show current log file name in plugin description.
 * Remove log file name limit of 255 bytes.

src/plugins/newmail/newmail.c

index e3d7bfdb6a5be7bea5e9fb6eaddddd7ceca9db91..268e3e8c026b162010a1471202f8588793dc0edc 100644 (file)
 
 #include "plugin.h"
 
+#define LOG_NAME       "NewLog"
+#define DEFAULT_DIR    "Mail"
+
 static guint hook_id;
 
 static FILE *NewLog   = NULL;
 static char *LogName  = NULL;
 static int   truncLog = 1;
+static char *pluginDesc = NULL;
 
 static gchar *defstr (gchar *s)
 {
@@ -84,8 +88,15 @@ gboolean plugin_done (void)
        if (NewLog) {
                (void)fclose (NewLog);
                NewLog  = NULL;
+       }
+       if (LogName) {
+               g_free(LogName);
                LogName = NULL;
        }
+       if (pluginDesc) {
+               g_free(pluginDesc);
+               pluginDesc = NULL;
+       }
        hooks_unregister_hook (MAIL_POSTFILTERING_HOOKLIST, hook_id);
 
        debug_print ("Newmail plugin unloaded\n");
@@ -107,28 +118,32 @@ gint plugin_init (gchar **error)
        if (!NewLog) {
                auto char *mode = truncLog ? "w" : "a";
                if (!LogName) {
-                       auto size_t l;
-                       auto char   name[260];
-                       (void)snprintf (name, 256, "%s/Mail/NewLog", getenv ("HOME"));
-                       l = strlen (name);
-                       if (l > 255 || !(LogName = (char *)malloc (l + 1))) {
-                               *error = g_strdup (_("Cannot load plugin NewMail\n"
-                                    "$HOME is too long\n"));
+                       LogName = g_strconcat(getenv ("HOME"), G_DIR_SEPARATOR_S, DEFAULT_DIR,
+                                       G_DIR_SEPARATOR_S, LOG_NAME, NULL);
+               }
+               if (!(NewLog = fopen (LogName, mode))) {
+                       debug_print ("Failed to open default log %s\n", LogName);
+                       /* try fallback location */
+                       g_free(LogName);
+                       LogName = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, LOG_NAME, NULL);
+                       if (!(NewLog = fopen (LogName, mode))) {
+                               debug_print ("Failed to open fallback log %s\n", LogName);
+                               *error = g_strdup_printf(_("Could not open log file %s: %s\n"),
+                                               LogName, sys_errlist[errno]);
                                plugin_done ();
                                return (-1);
                        }
-                       (void)strcpy (LogName, name);
-               }
-               if (!(NewLog = fopen (LogName, mode))) {
-                       *error = g_strdup (sys_errlist[errno]);
-                       plugin_done ();
-                       return (-1);
                }
                setbuf (NewLog, NULL);
        }
 
        debug_print ("Newmail plugin loaded\n"
               "Message header summaries written to %s\n", LogName);
+       if (pluginDesc == NULL)
+               pluginDesc = g_strdup_printf(
+                       _("This plugin writes a header summary to a log file for each "
+                       "mail received after sorting.\n\n"
+                       "Default is ~/Mail/NewLog\n\nCurrent log is %s"), LogName);
        return (0);
 } /* plugin_init */
 
@@ -139,9 +154,7 @@ const gchar *plugin_name (void)
 
 const gchar *plugin_desc (void)
 {
-    return _("This Plugin writes a header summary to a log file for each "
-            "mail received after sorting.\n\n"
-            "Default is ~/Mail/NewLog");
+    return pluginDesc;
 } /* plugin_desc */
 
 const gchar *plugin_type (void)