fixes bad semantics (an invalid fd is -1 not 0).
[apps/madmutt.git] / recvattach.c
index 50d3601..b9db799 100644 (file)
@@ -139,19 +139,15 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m,
  * %s = size
  * %u = unlink 
  */
-const char *mutt_attach_fmt (char *dest,
-                             ssize_t destlen,
-                             char op,
-                             const char *src,
-                             const char *prefix,
-                             const char *ifstring,
-                             const char *elsestring,
-                             unsigned long data, format_flag flags)
+const char *
+mutt_attach_fmt(char *dest, ssize_t destlen, char op, const char *src,
+                const char *prefix, const char *ifstr, const char *elstr,
+                anytype data, format_flag flags)
 {
   char fmt[16];
   char tmp[STRING];
   char charset[STRING];
-  ATTACHPTR *aptr = (ATTACHPTR *) data;
+  ATTACHPTR *aptr = data.ptr;
   int optional = (flags & M_FORMAT_OPTIONAL);
   ssize_t l;
 
@@ -191,7 +187,7 @@ const char *mutt_attach_fmt (char *dest,
 
         _mutt_make_string (s, sizeof (s), MsgFmt, NULL, aptr->content->hdr,
                            M_FORMAT_FORCESUBJ | M_FORMAT_MAKEPRINT |
-                           M_FORMAT_ARROWCURSOR);
+                           (option(OPTARROWCURSOR) ? M_FORMAT_ARROWCURSOR : 0));
         if (*s) {
           mutt_format_s (dest, destlen, prefix, s);
           break;
@@ -312,19 +308,17 @@ const char *mutt_attach_fmt (char *dest,
     *dest = 0;
   }
 
-  if (optional)
-    m_strformat (dest, destlen, ifstring, mutt_attach_fmt, data, 0);
-  else if (flags & M_FORMAT_OPTIONAL)
-    m_strformat (dest, destlen, elsestring, mutt_attach_fmt, data, 0);
-  return (src);
+  if (flags & M_FORMAT_OPTIONAL)
+    m_strformat(dest, destlen, 0, optional ? ifstr : elstr,
+                mutt_attach_fmt, data, 0);
+  return src;
 }
 
-static void attach_entry (char *b, ssize_t blen, MUTTMENU * menu, int num)
+static void attach_entry(char *b, ssize_t blen, MUTTMENU * menu, int num)
 {
-  int w=(COLS-SW)>blen?blen:(COLS-SW);
-  m_strformat (b, w, NONULL (AttachFormat), mutt_attach_fmt,
-                     (unsigned long) (((ATTACHPTR **) menu->data)[num]),
-                     M_FORMAT_ARROWCURSOR);
+    m_strformat(b, blen, COLS - SW, AttachFormat, mutt_attach_fmt,
+                ((ATTACHPTR **) menu->data)[num],
+                option(OPTARROWCURSOR) ? M_FORMAT_ARROWCURSOR : 0);
 }
 
 int mutt_tag_attach (MUTTMENU * menu, int n, int m)
@@ -492,33 +486,32 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr,
 }
 
 static void
-mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int afilter)
+mutt_query_pipe_attachment(char *command, FILE * fp, BODY * body, int afilter)
 {
   char tfile[_POSIX_PATH_MAX];
   char warning[STRING + _POSIX_PATH_MAX];
+  int tempfd = -1;
 
   if (afilter) {
-    snprintf (warning, sizeof (warning),
-              _("WARNING!  You are about to overwrite %s, continue?"),
-              body->filename);
+    snprintf(warning, sizeof (warning),
+             _("WARNING!  You are about to overwrite %s, continue?"),
+             body->filename);
     if (mutt_yesorno (warning, M_NO) != M_YES) {
       CLEARLINE (LINES - 1);
       return;
     }
-    mutt_mktemp (tfile);
-  } else {
-    tfile[0] = '\0';
+    tempfd = m_tempfd(tfile, sizeof(tfile), NONULL(Tempdir), NULL);
   }
 
-  if (mutt_pipe_attachment (fp, body, command, tfile)) {
+  if (mutt_pipe_attachment(fp, body, command, tempfd)) {
     if (afilter) {
       mutt_unlink (body->filename);
       mutt_rename_file (tfile, body->filename);
       mutt_update_encoding (body);
       mutt_message _("Attachment filtered.");
     }
-  } else {
-    if (afilter && tfile[0])
+  } else if (afilter) {
+      close(tempfd);
       mutt_unlink (tfile);
   }
 }
@@ -639,10 +632,10 @@ static void print_attachment_list (FILE * fp, int tag, BODY * top,
 
           char newfile[_POSIX_PATH_MAX] = "";
           FILE *ifp;
+          int newfile_fd;
 
-          mutt_mktemp (newfile);
-          if (mutt_decode_save_attachment (fp, top, newfile, M_PRINTING, 0) ==
-              0) {
+          newfile_fd = m_tempfd(newfile, sizeof(newfile), NONULL(Tempdir), NULL);
+          if (mutt_decode_save_attachment (fp, top, newfile_fd, M_PRINTING) == 0) {
             if ((ifp = fopen (newfile, "r")) != NULL) {
               mutt_copy_stream (ifp, state->fpout);
               m_fclose(&ifp);