Use good m_ functions, because it smell like a flower, version 2.
[apps/madmutt.git] / recvattach.c
index ec57733..d4ebd3d 100644 (file)
@@ -8,40 +8,25 @@
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/macros.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/file.h>
-#include <lib-lib/mapping.h>
+#include <lib-lib/lib-lib.h>
 
 #include <lib-mime/mime.h>
 
+#include <lib-ui/curses.h>
+#include <lib-ui/enter.h>
+#include <lib-ui/menu.h>
+#include <lib-mx/mx.h>
+
+#include <lib-sys/unix.h>
+
 #include "mutt.h"
-#include "enter.h"
 #include "handler.h"
 #include "recvattach.h"
-#include "mutt_curses.h"
-#include "mutt_menu.h"
-#include "rfc1524.h"
 #include "attach.h"
-#include "mx.h"
 #include "copy.h"
 #include <lib-crypt/crypt.h>
 
 
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <errno.h>
-
 static const char *Mailbox_is_read_only = N_("Mailbox is read-only.");
 static char LastSaveFolder[_POSIX_PATH_MAX] = "";
 
@@ -63,7 +48,7 @@ static struct mapping_t AttachHelp[] = {
   {NULL, OP_NULL}
 };
 
-static int mutt_extract_path (char *filename, char *path)
+static int mutt_extract_path (char *filename, char *path, ssize_t pathlen)
 {
   char *tmp = p_new(char, _POSIX_PATH_MAX);
   char *help_ptr;
@@ -74,7 +59,7 @@ static int mutt_extract_path (char *filename, char *path)
     if (*filename == '/') {
       *help_ptr++ = *filename++;
       *help_ptr++ = '\0';
-      strcat (path, tmp);
+      m_strcat(path, pathlen, tmp);
       help_ptr = tmp;
     }
     *help_ptr++ = *filename++;
@@ -91,7 +76,7 @@ void mutt_update_tree (ATTACHPTR ** idx, short idxlen)
 
   for (x = 0; x < idxlen; x++) {
     idx[x]->num = x;
-    if (2 * (idx[x]->level + 2) < sizeof (buf)) {
+    if (2 * (idx[x]->level + 2) < ssizeof (buf)) {
       if (idx[x]->level) {
         s = buf + 2 * (idx[x]->level - 1);
         *s++ = (idx[x]->content->next) ? M_TREE_LTEE : M_TREE_LLCORNER;
@@ -110,7 +95,7 @@ void mutt_update_tree (ATTACHPTR ** idx, short idxlen)
     else
       idx[x]->tree = m_strdup(buf);
 
-    if (2 * (idx[x]->level + 2) < sizeof (buf) && idx[x]->level) {
+    if (2 * (idx[x]->level + 2) < ssizeof (buf) && idx[x]->level) {
       s = buf + 2 * (idx[x]->level - 1);
       *s++ = (idx[x]->content->next) ? '\005' : '\006';
       *s++ = '\006';
@@ -187,7 +172,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m,
  * %u = unlink 
  */
 const char *mutt_attach_fmt (char *dest,
-                             size_t destlen,
+                             ssize_t destlen,
                              char op,
                              const char *src,
                              const char *prefix,
@@ -200,7 +185,7 @@ const char *mutt_attach_fmt (char *dest,
   char charset[SHORT_STRING];
   ATTACHPTR *aptr = (ATTACHPTR *) data;
   int optional = (flags & M_FORMAT_OPTIONAL);
-  size_t l;
+  ssize_t l;
 
   switch (op) {
   case 'C':
@@ -367,7 +352,7 @@ const char *mutt_attach_fmt (char *dest,
   return (src);
 }
 
-static void attach_entry (char *b, size_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);
   mutt_FormatString (b, w, NONULL (AttachFormat), mutt_attach_fmt,
@@ -439,7 +424,7 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr,
         return -1;
     }
     else {
-      mutt_extract_path (buf, path);
+      mutt_extract_path (buf, path, sizeof(path));
       m_strcpy(LastSaveFolder, sizeof(LastSaveFolder), path);
     }
 
@@ -520,14 +505,14 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr,
           rc = mutt_save_attachment (fp, top, tfile, append, hdr);
           if (rc == 0 && AttachSep && (fpout = fopen (tfile, "a")) != NULL) {
             fprintf (fpout, "%s", AttachSep);
-            fclose (fpout);
+            m_fclose(&fpout);
           }
         }
         else {
           rc = mutt_save_attachment (fp, top, tfile, M_SAVE_APPEND, hdr);
           if (rc == 0 && AttachSep && (fpout = fopen (tfile, "a")) != NULL) {
             fprintf (fpout, "%s", AttachSep);
-            fclose (fpout);
+            m_fclose(&fpout);
           }
         }
       }
@@ -564,12 +549,12 @@ 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 filter)
+mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int afilter)
 {
   char tfile[_POSIX_PATH_MAX];
   char warning[STRING + _POSIX_PATH_MAX];
 
-  if (filter) {
+  if (afilter) {
     snprintf (warning, sizeof (warning),
               _("WARNING!  You are about to overwrite %s, continue?"),
               body->filename);
@@ -583,7 +568,7 @@ mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int filter)
     tfile[0] = 0;
 
   if (mutt_pipe_attachment (fp, body, command, tfile)) {
-    if (filter) {
+    if (afilter) {
       mutt_unlink (body->filename);
       mutt_rename_file (tfile, body->filename);
       mutt_update_encoding (body);
@@ -591,7 +576,7 @@ mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int filter)
     }
   }
   else {
-    if (filter && tfile[0])
+    if (afilter && tfile[0])
       mutt_unlink (tfile);
   }
 }
@@ -612,7 +597,7 @@ static void pipe_attachment (FILE * fp, BODY * b, STATE * state)
       return;
     }
     mutt_copy_stream (ifp, state->fpout);
-    fclose (ifp);
+    m_fclose(&ifp);
     if (AttachSep)
       state_puts (AttachSep, state);
   }
@@ -620,50 +605,50 @@ static void pipe_attachment (FILE * fp, BODY * b, STATE * state)
 
 static void
 pipe_attachment_list (char *command, FILE * fp, int tag, BODY * top,
-                      int filter, STATE * state)
+                      int afilter, STATE * state)
 {
   for (; top; top = top->next) {
     if (!tag || top->tagged) {
-      if (!filter && !option (OPTATTACHSPLIT))
+      if (!afilter && !option (OPTATTACHSPLIT))
         pipe_attachment (fp, top, state);
       else
-        mutt_query_pipe_attachment (command, fp, top, filter);
+        mutt_query_pipe_attachment (command, fp, top, afilter);
     }
     else if (top->parts)
-      pipe_attachment_list (command, fp, tag, top->parts, filter, state);
+      pipe_attachment_list (command, fp, tag, top->parts, afilter, state);
     if (!tag)
       break;
   }
 }
 
-void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int filter)
+void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int afilter)
 {
   STATE state;
   char buf[SHORT_STRING];
   pid_t thepid;
 
   if (fp)
-    filter = 0;                 /* sanity check: we can't filter in the recv case yet */
+    afilter = 0;                 /* sanity check: we can't filter in the recv case yet */
 
   buf[0] = 0;
   p_clear(&state, 1);
 
-  if (mutt_get_field ((filter ? _("Filter through: ") : _("Pipe to: ")),
+  if (mutt_get_field ((afilter ? _("Filter through: ") : _("Pipe to: ")),
                       buf, sizeof (buf), M_CMD) != 0 || !buf[0])
     return;
 
   mutt_expand_path (buf, sizeof (buf));
 
-  if (!filter && !option (OPTATTACHSPLIT)) {
+  if (!afilter && !option (OPTATTACHSPLIT)) {
     mutt_endwin (NULL);
     thepid = mutt_create_filter (buf, &state.fpout, NULL, NULL);
-    pipe_attachment_list (buf, fp, tag, top, filter, &state);
-    fclose (state.fpout);
+    pipe_attachment_list (buf, fp, tag, top, afilter, &state);
+    m_fclose(&state.fpout);
     if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY))
       mutt_any_key_to_continue (NULL);
   }
   else
-    pipe_attachment_list (buf, fp, tag, top, filter, &state);
+    pipe_attachment_list (buf, fp, tag, top, afilter, &state);
 }
 
 static int can_print (BODY * top, int tag)
@@ -716,7 +701,7 @@ static void print_attachment_list (FILE * fp, int tag, BODY * top,
               0) {
             if ((ifp = fopen (newfile, "r")) != NULL) {
               mutt_copy_stream (ifp, state->fpout);
-              fclose (ifp);
+              m_fclose(&ifp);
               if (AttachSep)
                 state_puts (AttachSep, state);
             }
@@ -753,7 +738,7 @@ void mutt_print_attachment_list (FILE * fp, int tag, BODY * top)
     p_clear(&state, 1);
     thepid = mutt_create_filter (NONULL (PrintCmd), &state.fpout, NULL, NULL);
     print_attachment_list (fp, tag, top, &state);
-    fclose (state.fpout);
+    m_fclose(&state.fpout);
     if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY))
       mutt_any_key_to_continue (NULL);
   }
@@ -791,12 +776,6 @@ mutt_attach_display_loop (MUTTMENU * menu, int op, FILE * fp, HEADER * hdr,
 {
   ATTACHPTR **idx = *idxp;
 
-#if 0
-  int old_optweed = option (OPTWEED);
-
-  set_option (OPTWEED);
-#endif
-
   do {
     switch (op) {
     case OP_DISPLAY_HEADERS:
@@ -852,10 +831,6 @@ mutt_attach_display_loop (MUTTMENU * menu, int op, FILE * fp, HEADER * hdr,
   }
   while (op != OP_NULL);
 
-#if 0
-  if (option (OPTWEED) != old_optweed)
-    toggle_option (OPTWEED);
-#endif
   return op;
 }
 
@@ -952,8 +927,8 @@ void mutt_view_attachments (HEADER * hdr)
           cur = NULL;
           secured = !crypt_smime_decrypt_mime (_fp, &fp, _cur, &cur);
 
-          mutt_free_body (&_cur);
-          safe_fclose (&_fp);
+          body_list_wipe(&_cur);
+          m_fclose(&_fp);
         }
       }
       else
@@ -1243,8 +1218,8 @@ void mutt_view_attachments (HEADER * hdr)
       idxmax = 0;
 
       if (need_secured && secured) {
-        fclose (fp);
-        mutt_free_body (&cur);
+        m_fclose(&fp);
+        body_list_wipe(&cur);
       }
 
       mutt_menuDestroy (&menu);