oops, I did it again: simplify a lot of code :]
[apps/madmutt.git] / attach.c
index 9114d86..2b9fb0f 100644 (file)
--- a/attach.c
+++ b/attach.c
@@ -45,21 +45,19 @@ int mutt_get_tmp_attachment (BODY * a)
   if (stat (a->filename, &st) == -1)
     return -1;
 
-  if ((fpin = fopen (a->filename, "r")) && (fpout = safe_fopen (tempfile, "w"))) {      /* __FOPEN_CHECKED__ */
+  if ((fpin = fopen (a->filename, "r")) && (fpout = safe_fopen (tempfile, "w"))) {
     mutt_copy_stream (fpin, fpout);
     m_strreplace(&a->filename, tempfile);
     a->unlink = 1;
 
     if (a->stamp >= st.st_mtime)
       mutt_stamp_attachment (a);
-  }
-  else
+  } else {
     mutt_perror(fpin ? tempfile : a->filename);
+  }
 
-  if (fpin)
-    fclose (fpin);
-  if (fpout)
-    fclose (fpout);
+  m_fclose(&fpin);
+  m_fclose(&fpout);
 
   return a->unlink ? 0 : -1;
 }
@@ -89,19 +87,18 @@ int mutt_compose_attachment (BODY * a)
           if (mutt_yesorno (_("Can't match nametemplate, continue?"), M_YES)
               != M_YES)
             goto bailout;
-        }
-        else
+        } else {
           unlink_newfile = 1;
-      }
-      else
+        }
+      } else {
         m_strcpy(newfile, sizeof(newfile), a->filename);
+      }
 
       if (rfc1524_expand_command (a, newfile, type,
                                   command, sizeof (command))) {
         /* For now, editing requires a file, no piping */
         mutt_error _("Mailcap compose entry requires %%s");
-      }
-      else {
+      } else {
         int r;
 
         mutt_endwin (NULL);
@@ -147,8 +144,8 @@ int mutt_compose_attachment (BODY * a)
               goto bailout;
             }
             mutt_copy_stream (fp, tfp);
-            fclose (fp);
-            fclose (tfp);
+            m_fclose(&fp);
+            m_fclose(&tfp);
             mutt_unlink (a->filename);
             if (mutt_rename_file (tempfile, a->filename) != 0) {
               mutt_perror (_("Failure to rename file."));
@@ -161,8 +158,7 @@ int mutt_compose_attachment (BODY * a)
         }
       }
     }
-  }
-  else {
+  } else {
     rfc1524_entry_delete(&entry);
     mutt_message (_("No mailcap compose entry for %s, creating empty file."),
                   type);
@@ -209,20 +205,19 @@ int mutt_edit_attachment (BODY * a)
           if (mutt_yesorno (_("Can't match nametemplate, continue?"), M_YES)
               != M_YES)
             goto bailout;
-        }
-        else
+        } else {
           unlink_newfile = 1;
-      }
-      else
+        }
+      } else {
         m_strcpy(newfile, sizeof(newfile), a->filename);
+      }
 
       if (rfc1524_expand_command (a, newfile, type,
                                   command, sizeof (command))) {
         /* For now, editing requires a file, no piping */
         mutt_error _("Mailcap Edit entry requires %%s");
         goto bailout;
-      }
-      else {
+      } else {
         mutt_endwin (NULL);
         if (mutt_system (command) == -1) {
           mutt_error (_("Error running \"%s\"!"), command);
@@ -234,8 +229,7 @@ int mutt_edit_attachment (BODY * a)
   else if (a->type == TYPETEXT) {
     /* On text, default to editor */
     mutt_edit_file (NONULL (Editor), a->filename);
-  }
-  else {
+  } else {
     rfc1524_entry_delete(&entry);
     mutt_error (_("No mailcap edit entry for %s"), type);
     return 0;
@@ -271,13 +265,11 @@ static int is_mmnoask (const char *buf)
         if (*(q + 1) == '*') {
           if (ascii_strncasecmp (buf, p, q - p) == 0)
             return (1);
-        }
-        else {
+        } else {
           if (ascii_strcasecmp (buf, p) == 0)
             return (1);
         }
-      }
-      else {
+      } else {
         lng = m_strlen(p);
         if (buf[lng] == '/' && m_strncasecmp(buf, p, lng) == 0)
           return (1);
@@ -328,11 +320,11 @@ void mutt_check_lookup_list (BODY * b, char *type, int len)
 int mutt_is_autoview (BODY * b, const char *type)
 {
   string_list_t *t = AutoViewList;
-  char _type[SHORT_STRING];
+  char _type[STRING];
   int i;
 
   if (!type)
-    snprintf (_type, sizeof (_type), "%s/%s", TYPE (b), b->subtype);
+    snprintf(_type, sizeof(_type), "%s/%s", TYPE(b), b->subtype);
   else
     m_strcpy(_type, sizeof(_type), type);
 
@@ -375,8 +367,9 @@ int mutt_view_attachment (FILE * fp, BODY * a, int flag, HEADER * hdr,
   rfc1524_entry *entry = NULL;
   int rc = -1;
   int unlink_tempfile = 0;
+  int pagerfd = -1;
 
-  is_message = mutt_is_message_type (a->type, a->subtype);
+  is_message = mutt_is_message_type(a);
   if (is_message && a->hdr && (a->hdr->security & ENCRYPT) &&
       !crypt_valid_passphrase (a->hdr->security))
     return (rc);
@@ -446,26 +439,20 @@ int mutt_view_attachment (FILE * fp, BODY * a, int flag, HEADER * hdr,
   }
 
   if (use_pager) {
-    if (fp && !use_mailcap && a->filename) {
-      /* recv case */
-      m_strcpy(pagerfile, sizeof(pagerfile), a->filename);
-      mutt_adv_mktemp (NULL, pagerfile, sizeof (pagerfile));
-    }
-    else
-      mutt_mktemp (pagerfile);
+    /* recv case */
+    pagerfd = m_tempfd(pagerfile, sizeof(pagerfile), NONULL(Tempdir),
+                       fp && !use_mailcap ? a->filename : NULL);
   }
 
   if (use_mailcap) {
     pid_t thepid = 0;
-    int tempfd = -1, pagerfd = -1;
+    int tempfd = -1;
 
     if (!use_pager)
       mutt_endwin (NULL);
 
     if (use_pager || use_pipe) {
-      if (use_pager
-          && ((pagerfd = safe_open (pagerfile, O_CREAT | O_EXCL | O_WRONLY))
-              == -1)) {
+      if (use_pager && pagerfd == -1) {
         mutt_perror ("open");
         goto return_error;
       }
@@ -614,7 +601,7 @@ int mutt_pipe_attachment (FILE * fp, BODY * b, const char *path,
 
     s.fpin = fp;
     mutt_decode_attachment (b, &s);
-    safe_fclose (&s.fpout);
+    m_fclose(&s.fpout);
   }
   else {
     /* send case */
@@ -638,13 +625,13 @@ int mutt_pipe_attachment (FILE * fp, BODY * b, const char *path,
     if (thepid < 0) {
       mutt_perror (_("Can't create filter"));
 
-      safe_fclose (&ifp);
+      m_fclose(&ifp);
       goto bail;
     }
 
     mutt_copy_stream (ifp, ofp);
-    safe_fclose (&ofp);
-    safe_fclose (&ifp);
+    m_fclose(&ofp);
+    m_fclose(&ifp);
   }
 
   rv = 1;
@@ -673,7 +660,7 @@ static FILE *mutt_save_attachment_open (char *path, int flags)
    * as safe_fopen returns w/ an error if path exists
    */
   if (flags == M_SAVE_OVERWRITE)
-    return fopen (path, "w");   /* __FOPEN_CHECKED__ */
+    return fopen (path, "w");
 
   return safe_fopen (path, "w");
 }
@@ -690,7 +677,7 @@ int mutt_save_attachment (FILE * fp, BODY * m, char *path, int flags,
         m->hdr &&
         m->encoding != ENCBASE64 &&
         m->encoding != ENCQUOTEDPRINTABLE &&
-        mutt_is_message_type (m->type, m->subtype)) {
+        mutt_is_message_type(m)) {
       /* message type attachments are written to mail folders. */
 
       char buf[HUGE_STRING];
@@ -742,13 +729,12 @@ int mutt_save_attachment (FILE * fp, BODY * m, char *path, int flags,
       fseeko ((s.fpin = fp), m->offset, 0);
       mutt_decode_attachment (m, &s);
 
-      if (fclose (s.fpout) != 0) {
+      if (m_fclose(&s.fpout) != 0) {
         mutt_perror ("fclose");
         return (-1);
       }
     }
-  }
-  else {
+  } else {
     /* In send mode, just copy file */
 
     FILE *ofp, *nfp;
@@ -760,19 +746,19 @@ int mutt_save_attachment (FILE * fp, BODY * m, char *path, int flags,
 
     if ((nfp = mutt_save_attachment_open (path, flags)) == NULL) {
       mutt_perror ("fopen");
-      safe_fclose (&ofp);
+      m_fclose(&ofp);
       return (-1);
     }
 
     if (mutt_copy_stream (ofp, nfp) == -1) {
       mutt_error _("Write fault!");
 
-      safe_fclose (&ofp);
-      safe_fclose (&nfp);
+      m_fclose(&ofp);
+      m_fclose(&nfp);
       return (-1);
     }
-    safe_fclose (&ofp);
-    safe_fclose (&nfp);
+    m_fclose(&ofp);
+    m_fclose(&nfp);
   }
 
   return 0;
@@ -792,8 +778,6 @@ int mutt_decode_save_attachment (FILE * fp, BODY * m, char *path,
 
   if (flags == M_SAVE_APPEND)
     s.fpout = fopen (path, "a");
-  else if (flags == M_SAVE_OVERWRITE)
-    s.fpout = safe_fopen (path, "w");   /* __FOPEN_CHECKED__ */
   else
     s.fpout = safe_fopen (path, "w");
 
@@ -809,7 +793,7 @@ int mutt_decode_save_attachment (FILE * fp, BODY * m, char *path,
 
     if (stat (m->filename, &st) == -1) {
       mutt_perror ("stat");
-      fclose (s.fpout);
+      m_fclose(&s.fpout);
       return (-1);
     }
 
@@ -838,7 +822,7 @@ int mutt_decode_save_attachment (FILE * fp, BODY * m, char *path,
 
   mutt_body_handler (m, &s);
 
-  fclose (s.fpout);
+  m_fclose(&s.fpout);
   if (fp == NULL) {
     m->length = 0;
     m->encoding = saved_encoding;
@@ -847,7 +831,7 @@ int mutt_decode_save_attachment (FILE * fp, BODY * m, char *path,
       m->parts = saved_parts;
       m->hdr = saved_hdr;
     }
-    fclose (s.fpin);
+    m_fclose(&s.fpin);
   }
 
   return (0);
@@ -867,6 +851,7 @@ int mutt_print_attachment (FILE * fp, BODY * a)
   pid_t thepid;
   FILE *ifp, *fpout;
   short unlink_newfile = 0;
+  int tok;
 
   snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype);
 
@@ -915,12 +900,12 @@ int mutt_print_attachment (FILE * fp, BODY * a)
         mutt_perror (_("Can't create filter"));
 
         rfc1524_entry_delete(&entry);
-        safe_fclose (&ifp);
+        m_fclose(&ifp);
         return 0;
       }
       mutt_copy_stream (ifp, fpout);
-      safe_fclose (&fpout);
-      safe_fclose (&ifp);
+      m_fclose(&fpout);
+      m_fclose(&ifp);
       if (mutt_wait_filter (thepid) || option (OPTWAITKEY))
         mutt_any_key_to_continue (NULL);
     }
@@ -938,8 +923,8 @@ int mutt_print_attachment (FILE * fp, BODY * a)
     return (1);
   }
 
-  if (!ascii_strcasecmp ("text/plain", type) ||
-      !ascii_strcasecmp ("application/postscript", type)) {
+  tok = mime_which_token(type, -1);
+  if (tok == MIME_TEXT_PLAIN || tok == MIME_APPLICATION_POSTSCRIPT) {
     return (mutt_pipe_attachment (fp, a, NONULL (PrintCmd), NULL));
   }
   else if (mutt_can_decode (a)) {
@@ -968,16 +953,16 @@ int mutt_print_attachment (FILE * fp, BODY * a)
 
       mutt_copy_stream (ifp, fpout);
 
-      safe_fclose (&fpout);
-      safe_fclose (&ifp);
+      m_fclose(&fpout);
+      m_fclose(&ifp);
 
       if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY))
         mutt_any_key_to_continue (NULL);
       rc = 1;
     }
   bail0:
-    safe_fclose (&ifp);
-    safe_fclose (&fpout);
+    m_fclose(&ifp);
+    m_fclose(&fpout);
     mutt_unlink (newfile);
     return rc;
   }
@@ -1010,7 +995,7 @@ int mutt_attach_check (HEADER* hdr) {
       p++;
     }
   }
-  fclose (fp);
+  m_fclose(&fp);
 
   return (found);
 }