we use glibc, and gconv. Don't need our own transcoding stuff, glibc does
[apps/madmutt.git] / lib-mx / compress.c
index df6c761..01e4a07 100644 (file)
@@ -12,7 +12,7 @@
 #include <lib-sys/mutt_signal.h>
 #include <lib-sys/unix.h>
 
-#include <lib-ui/curses.h>
+#include <lib-ui/lib-ui.h>
 
 #include "mutt.h"
 
@@ -38,7 +38,7 @@ static int mbox_lock_compressed (CONTEXT * ctx, FILE * fp, int excl, int retry)
 {
   int r;
 
-  if ((r = mx_lock_file (ctx->realpath, fileno (fp), excl, 1, retry)) == 0)
+  if ((r = mx_lock_file (ctx->realpath, fileno (fp), excl, retry)) == 0)
     ctx->locked = 1;
   else if (retry && !excl) {
     ctx->readonly = 1;
@@ -52,8 +52,7 @@ static void mbox_unlock_compressed (CONTEXT * ctx, FILE * fp)
 {
   if (ctx->locked) {
     fflush (fp);
-
-    mx_unlock_file (ctx->realpath, fileno (fp), 1);
+    mx_unlock_file(ctx->realpath, fileno(fp));
     ctx->locked = 0;
   }
 }
@@ -65,9 +64,24 @@ static int is_new (const char *path)
 
 static const char *find_compress_hook (int type, const char *path)
 {
-  const char *c = mutt_find_hook (type, path);
-
-  return (!c || !*c) ? NULL : c;
+  int len = strlen(path);
+  if (len > 3 && !strcmp(path + len - 3, ".gz")) {
+      switch (type) {
+        case M_OPENHOOK:   return "gzip -cd %f > %t";
+        case M_CLOSEHOOK:  return "gzip -cd %t > %f";
+        case M_APPENDHOOK: return "gzip -cd %t >> %f";
+        default: return NULL;
+      }
+  }
+  if (len > 4 && !strcmp(path + len - 4, ".bz2")) {
+      switch (type) {
+        case M_OPENHOOK:   return "bzip2 -cd %f > %t";
+        case M_CLOSEHOOK:  return "bzip2 -cd %t > %f";
+        case M_APPENDHOOK: return "bzip2 -cd %t >> %f";
+        default: return NULL;
+      }
+  }
+  return NULL;
 }
 
 int mutt_can_read_compressed (const char *path)
@@ -196,7 +210,7 @@ int mutt_open_read_compressed(CONTEXT * ctx)
   ctx->realpath = ctx->path;
 
   /* Uncompress to /tmp */
-  tmpfd = m_tempfd(tmppath, sizeof(tmppath), NONULL(Tempdir), NULL);
+  tmpfd = m_tempfd(tmppath, sizeof(tmppath), NONULL(mod_core.tmpdir), NULL);
   /* If we cannot open tempfile, that means the file already exists (!?)
    * or we are following a symlink, which is bad and insecure.
    */
@@ -266,7 +280,7 @@ static void restore_path (CONTEXT * ctx)
 /* remove the temporary mailbox */
 static void remove_file (CONTEXT * ctx)
 {
-  if (ctx->magic == M_MBOX || ctx->magic == M_MMDF)
+  if (ctx->magic == M_MBOX)
     remove (ctx->path);
 }
 
@@ -289,20 +303,17 @@ int mutt_open_append_compressed (CONTEXT * ctx)
   ctx->realpath = ctx->path;
 
   /* Uncompress to /tmp */
-  fh = m_tempfile(tmppath, sizeof(tmppath), NONULL(Tempdir), NULL);
+  fh = m_tempfile(tmppath, sizeof(tmppath), NONULL(mod_core.tmpdir), NULL);
   m_fclose(&fh);
 
   ctx->path = p_dupstr(tmppath, m_strlen(tmppath));
 
   ctx->magic = DefaultMagic;
 
-  if (is_new (ctx->realpath) || 
-      (ctx->magic != M_MBOX &&
-       ctx->magic != M_MMDF))
+  if (is_new (ctx->realpath) || ctx->magic != M_MBOX)
       unlink(tmppath);
 
   /* No error checking - the parent function will catch it */
-
   return 0;
 }
 
@@ -313,11 +324,7 @@ void mutt_fast_close_compressed (CONTEXT * ctx)
     m_fclose(&ctx->fp);
 
     /* if the folder was removed, remove the gzipped folder too */
-    if (access (ctx->path, F_OK) != 0 && !option (OPTSAVEEMPTY))
-      remove (ctx->realpath);
-    else
-      remove_file (ctx);
-
+    remove_file (ctx);
     restore_path (ctx);
     p_delete(&ctx->cinfo);
   }