Use m_tempfile and better errors msg
[apps/madmutt.git] / handler.c
index e7ca176..59c70de 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -7,28 +7,15 @@
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-
-#include <lib-lib/mem.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/str.h>
-#include <lib-lib/macros.h>
-#include <lib-lib/file.h>
+#include <lib-lib/lib-lib.h>
 
 #include <lib-mime/mime.h>
 #include <lib-mime/rfc3676.h>
 
 #include <lib-ui/curses.h>
 
+#include <lib-sys/unix.h>
+
 #include "mutt.h"
 #include "recvattach.h"
 #include "handler.h"
@@ -152,7 +139,7 @@ static void qp_decode_line (char *dest, char *src, ssize_t * l, int last)
  * 
  */
 
-void mutt_decode_quoted (STATE * s, long len, int istext, iconv_t cd)
+static void mutt_decode_quoted (STATE * s, long len, int istext, iconv_t cd)
 {
   char line[STRING];
   char decline[2 * STRING];
@@ -283,14 +270,14 @@ void mutt_decode_base64 (STATE * s, long len, int istext, iconv_t cd)
   state_reset_prefix (s);
 }
 
-unsigned char decode_byte (char ch)
+static unsigned char decode_byte (char ch)
 {
   if (ch == 96)
     return 0;
   return ch - 32;
 }
 
-void mutt_decode_uuencoded (STATE * s, long len, int istext, iconv_t cd)
+static void mutt_decode_uuencoded (STATE * s, long len, int istext, iconv_t cd)
 {
   char tmps[SHORT_STRING];
   char linelen, c, l, out;
@@ -644,7 +631,7 @@ static void enriched_set_flags (const char *tag, struct enriched_state *stte)
   }
 }
 
-int text_enriched_handler (BODY * a, STATE * s)
+static int text_enriched_handler (BODY * a, STATE * s)
 {
   enum {
     TEXT, LANGLE, TAG, BOGUS_TAG, NEWLINE, ST_EOF, DONE
@@ -781,14 +768,12 @@ static int alternative_handler (BODY * a, STATE * s)
 
     mustfree = 1;
     fstat (fileno (s->fpin), &st);
-    b = mutt_new_body ();
+    b = body_new();
     b->length = (long) st.st_size;
-    b->parts = mutt_parse_multipart (s->fpin,
-                                     mutt_get_parameter ("boundary",
-                                                         a->parameter),
-                                     (long) st.st_size,
-                                     ascii_strcasecmp ("digest",
-                                                       a->subtype) == 0);
+    b->parts = mutt_parse_multipart(s->fpin,
+                                    parameter_getval(a->parameter, "boundary"),
+                                    (long)st.st_size,
+                                    !ascii_strcasecmp("digest", a->subtype));
   }
   else
     b = a;
@@ -905,7 +890,7 @@ static int alternative_handler (BODY * a, STATE * s)
   }
 
   if (mustfree)
-    mutt_free_body (&a);
+    body_list_wipe(&a);
 
   return (rc);
 }
@@ -922,7 +907,7 @@ static int message_handler (BODY * a, STATE * s)
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED) {
     fstat (fileno (s->fpin), &st);
-    b = mutt_new_body ();
+    b = body_new();
     b->length = (long) st.st_size;
     b->parts = mutt_parse_messageRFC822 (s->fpin, b);
   }
@@ -946,7 +931,7 @@ static int message_handler (BODY * a, STATE * s)
 
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED)
-    mutt_free_body (&b);
+    body_list_wipe(&b);
 
   return (rc);
 }
@@ -997,14 +982,12 @@ static int multipart_handler (BODY * a, STATE * s)
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED) {
     fstat (fileno (s->fpin), &st);
-    b = mutt_new_body ();
+    b = body_new();
     b->length = (long) st.st_size;
-    b->parts = mutt_parse_multipart (s->fpin,
-                                     mutt_get_parameter ("boundary",
-                                                         a->parameter),
-                                     (long) st.st_size,
-                                     ascii_strcasecmp ("digest",
-                                                       a->subtype) == 0);
+    b->parts = mutt_parse_multipart(s->fpin,
+                                    parameter_getval(a->parameter, "boundary"),
+                                    (long)st.st_size,
+                                    !ascii_strcasecmp("digest", a->subtype));
   }
   else
     b = a;
@@ -1049,7 +1032,7 @@ static int multipart_handler (BODY * a, STATE * s)
 
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED)
-    mutt_free_body (&b);
+    body_list_wipe(&b);
 
   return (rc);
 }
@@ -1100,7 +1083,7 @@ static int autoview_handler (BODY * a, STATE * s)
     mutt_copy_bytes (s->fpin, fpin, a->length);
 
     if (!piped) {
-      safe_fclose (&fpin);
+      m_fclose(&fpin);
       thepid = mutt_create_filter (command, NULL, &fpout, &fperr);
     }
     else {
@@ -1157,12 +1140,12 @@ static int autoview_handler (BODY * a, STATE * s)
     }
 
   bail:
-    safe_fclose (&fpout);
-    safe_fclose (&fperr);
+    m_fclose(&fpout);
+    m_fclose(&fperr);
 
     mutt_wait_filter (thepid);
     if (piped)
-      safe_fclose (&fpin);
+      m_fclose(&fpin);
     else
       mutt_unlink (tempfile);
 
@@ -1179,7 +1162,7 @@ static int external_body_handler (BODY * b, STATE * s)
   const char *expiration;
   time_t expire;
 
-  access_type = mutt_get_parameter ("access-type", b->parameter);
+  access_type = parameter_getval(b->parameter, "access-type");
   if (!access_type) {
     if (s->flags & M_DISPLAY) {
       state_mark_attach (s);
@@ -1188,7 +1171,7 @@ static int external_body_handler (BODY * b, STATE * s)
     return (-1);
   }
 
-  expiration = mutt_get_parameter ("expiration", b->parameter);
+  expiration = parameter_getval(b->parameter, "expiration");
   if (expiration)
     expire = mutt_parse_date (expiration, NULL);
   else
@@ -1202,7 +1185,7 @@ static int external_body_handler (BODY * b, STATE * s)
       state_mark_attach (s);
       state_printf (s, _("[-- This %s/%s attachment "),
                     TYPE (b->parts), b->parts->subtype);
-      length = mutt_get_parameter ("length", b->parameter);
+      length = parameter_getval(b->parameter, "length");
       if (length) {
         mutt_pretty_size (pretty_size, sizeof (pretty_size),
                           strtol (length, NULL, 10));
@@ -1265,7 +1248,7 @@ void mutt_decode_attachment (BODY * b, STATE * s)
 
   if (istext) {
     if (s->flags & M_CHARCONV) {
-      const char *charset = mutt_get_parameter ("charset", b->parameter);
+      const char *charset = parameter_getval(b->parameter, "charset");
 
       if (!option (OPTSTRICTMIME) && !charset)
         charset = charset_getfirst(AssumedCharset);
@@ -1336,9 +1319,8 @@ int mutt_body_handler (BODY * b, STATE * s)
       if (mutt_is_application_pgp (b))
         handler = crypt_pgp_application_pgp_handler;
       else
-        if (ascii_strcasecmp
-            ("flowed", mutt_get_parameter ("format", b->parameter)) == 0)
-        handler = rfc3676_handler;
+        if (!ascii_strcasecmp("flowed", parameter_getval(b->parameter, "format")))
+          handler = rfc3676_handler;
       else
         plaintext = 1;
     }
@@ -1361,7 +1343,7 @@ int mutt_body_handler (BODY * b, STATE * s)
     if (ascii_strcasecmp ("alternative", b->subtype) == 0)
       handler = alternative_handler;
     else if (ascii_strcasecmp ("signed", b->subtype) == 0) {
-      p = mutt_get_parameter ("protocol", b->parameter);
+      p = parameter_getval(b->parameter, "protocol");
 
       if (!p)
         mutt_error (_("Error: multipart/signed has no protocol."));
@@ -1370,7 +1352,7 @@ int mutt_body_handler (BODY * b, STATE * s)
         handler = mutt_signed_handler;
     }
     else if (m_strcasecmp("encrypted", b->subtype) == 0) {
-      p = mutt_get_parameter ("protocol", b->parameter);
+      p = parameter_getval(b->parameter, "protocol");
 
       if (!p)
         mutt_error (_
@@ -1406,10 +1388,9 @@ int mutt_body_handler (BODY * b, STATE * s)
       if (!plaintext) {
         /* decode to a tempfile, saving the original destination */
         fp = s->fpout;
-        mutt_mktemp (tempfile);
-        if ((s->fpout = safe_fopen (tempfile, "w")) == NULL) {
+        s->fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+        if (!s->fpout) {
           mutt_error _("Unable to open temporary file!");
-
           goto bail;
         }
         /* decoding the attachment changes the size and offset, so save a copy
@@ -1425,16 +1406,16 @@ int mutt_body_handler (BODY * b, STATE * s)
         s->prefix = NULL;
 
         decode = 1;
-      }
-      else
+      } else {
         b->type = TYPETEXT;
+      }
 
       mutt_decode_attachment (b, s);
 
       if (decode) {
         b->length = ftello (s->fpout);
         b->offset = 0;
-        fclose (s->fpout);
+        m_fclose(&s->fpout);
 
         /* restore final destination and substitute the tempfile for input */
         s->fpout = fp;
@@ -1458,7 +1439,7 @@ int mutt_body_handler (BODY * b, STATE * s)
         b->offset = tmpoffset;
 
         /* restore the original source stream */
-        fclose (s->fpin);
+        m_fclose(&s->fpin);
         s->fpin = fp;
       }
     }