small detail in m_dirname.
[apps/madmutt.git] / recvattach.c
index bc59c76..dc51b4d 100644 (file)
@@ -8,51 +8,24 @@
  * 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-sys/unix.h>
 
 #include <lib-ui/curses.h>
 #include <lib-ui/enter.h>
 #include <lib-ui/menu.h>
+#include <lib-mx/mx.h>
+#include <lib-crypt/crypt.h>
 
 #include "mutt.h"
 #include "handler.h"
 #include "recvattach.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] = "";
-
-#define CHECK_READONLY if (Context->readonly) \
-{\
-    mutt_flushinp (); \
-    mutt_error _(Mailbox_is_read_only); \
-    break; \
-}
-
-#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
+#define SW    (option(OPTMBOXPANE)?SidebarWidth:0)
 
 static struct mapping_t AttachHelp[] = {
   {N_("Exit"), OP_EXIT},
@@ -63,26 +36,6 @@ static struct mapping_t AttachHelp[] = {
   {NULL, OP_NULL}
 };
 
-static int mutt_extract_path (char *filename, char *path)
-{
-  char *tmp = p_new(char, _POSIX_PATH_MAX);
-  char *help_ptr;
-
-  help_ptr = tmp;
-
-  while (*filename != '\0') {
-    if (*filename == '/') {
-      *help_ptr++ = *filename++;
-      *help_ptr++ = '\0';
-      strcat (path, tmp);
-      help_ptr = tmp;
-    }
-    *help_ptr++ = *filename++;
-  }
-  p_delete(&tmp);
-  return 0;
-}
-
 void mutt_update_tree (ATTACHPTR ** idx, short idxlen)
 {
   char buf[STRING];
@@ -157,7 +110,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m,
       /* We don't support multipart messages in the compose menu yet */
       if (!compose && !m->collapsed
       &&  ((m->type == TYPEMULTIPART && !mutt_is_multipart_encrypted(m))
-      ||  mutt_is_message_type (m->type, m->subtype)))
+      ||  mutt_is_message_type(m)))
       {
         idx = mutt_gen_attach_list (m->parts, m->type, idx, idxlen, idxmax,
                                     level + 1, compose);
@@ -232,8 +185,8 @@ const char *mutt_attach_fmt (char *dest,
         mutt_format_s (dest, destlen, prefix, aptr->content->description);
         break;
       }
-      if (mutt_is_message_type (aptr->content->type, aptr->content->subtype)
-          && MsgFmt && aptr->content->hdr) {
+      if (mutt_is_message_type(aptr->content) && MsgFmt && aptr->content->hdr)
+      {
         char s[SHORT_STRING];
 
         _mutt_make_string (s, sizeof (s), MsgFmt, NULL, aptr->content->hdr,
@@ -250,8 +203,7 @@ const char *mutt_attach_fmt (char *dest,
       }
     }
     else if (aptr->content->description ||
-             (mutt_is_message_type
-              (aptr->content->type, aptr->content->subtype)
+             (mutt_is_message_type(aptr->content)
               && MsgFmt && aptr->content->hdr))
       break;
     /* FALLS THROUGH TO 'f' */
@@ -384,22 +336,11 @@ int mutt_tag_attach (MUTTMENU * menu, int n, int m)
   return cur->tagged - ot;
 }
 
-int mutt_is_message_type (int type, const char *subtype)
-{
-  if (type != TYPEMESSAGE)
-    return 0;
-
-  subtype = NONULL (subtype);
-  return (ascii_strcasecmp (subtype, "rfc822") == 0
-          || ascii_strcasecmp (subtype, "news") == 0);
-}
-
 static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr,
                                        char **directory)
 {
   char *prompt;
   char buf[_POSIX_PATH_MAX], tfile[_POSIX_PATH_MAX];
-  char path[_POSIX_PATH_MAX] = "";
   int is_message;
   int append = 0;
   int rc;
@@ -415,42 +356,39 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr,
   else if (body->hdr &&
            body->encoding != ENCBASE64 &&
            body->encoding != ENCQUOTEDPRINTABLE &&
-           mutt_is_message_type (body->type, body->subtype))
+           mutt_is_message_type(body))
     mutt_default_save (buf, sizeof (buf), body->hdr);
   else
     buf[0] = 0;
 
   prompt = _("Save to file ('#' for last used folder): ");
   while (prompt) {
-    ret =
-      mutt_get_field (prompt, buf, sizeof (buf),
-                      M_FILE | M_CLEAR | M_LASTFOLDER);
+    static char LastSaveFolder[_POSIX_PATH_MAX] = ".";
+
+    ret = mutt_get_field(prompt, buf, sizeof (buf),
+                         M_FILE | M_CLEAR | M_LASTFOLDER);
     if (((ret != 0) && (ret != 2)) || (!buf[0] && ret != 2))
       return -1;
 
     if (ret == 2) {
       char tmpbuf[_POSIX_PATH_MAX];
 
-      snprintf (tmpbuf, sizeof (tmpbuf), "%s%s", LastSaveFolder, buf);
+      snprintf (tmpbuf, sizeof (tmpbuf), "%s/%s", LastSaveFolder, buf);
       m_strcpy(buf, sizeof(buf), tmpbuf);
-      ret = mutt_get_field (_("Save to file: ")
-                            , buf, sizeof (buf), M_FILE);
+      ret = mutt_get_field(_("Save to file: "), buf, sizeof (buf), M_FILE);
       if ((ret != 0) || (!buf[0]))
         return -1;
     }
-    else {
-      mutt_extract_path (buf, path);
-      m_strcpy(LastSaveFolder, sizeof(LastSaveFolder), path);
-    }
+    m_dirname(LastSaveFolder, sizeof(LastSaveFolder), buf);
 
     prompt = NULL;
-    mutt_expand_path (buf, sizeof (buf));
+    mutt_expand_path(buf, sizeof (buf));
 
     is_message = (fp &&
                   body->hdr &&
                   body->encoding != ENCBASE64 &&
                   body->encoding != ENCQUOTEDPRINTABLE &&
-                  mutt_is_message_type (body->type, body->subtype));
+                  mutt_is_message_type(body));
 
     if (is_message) {
       struct stat st;
@@ -520,14 +458,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);
           }
         }
       }
@@ -612,7 +550,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);
   }
@@ -658,7 +596,7 @@ void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int afilter)
     mutt_endwin (NULL);
     thepid = mutt_create_filter (buf, &state.fpout, NULL, NULL);
     pipe_attachment_list (buf, fp, tag, top, afilter, &state);
-    fclose (state.fpout);
+    m_fclose(&state.fpout);
     if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY))
       mutt_any_key_to_continue (NULL);
   }
@@ -716,7 +654,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 +691,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 +729,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 +784,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;
 }
 
@@ -867,10 +795,9 @@ static void attach_collapse (BODY * b, short collapse, short init,
   for (; b; b = b->next) {
     i = init || b->collapsed;
     if (i && option (OPTDIGESTCOLLAPSE) && b->type == TYPEMULTIPART
-        && !ascii_strcasecmp (b->subtype, "digest"))
+        && mime_which_token(b->subtype, -1) == MIME_DIGEST)
       attach_collapse (b->parts, 1, 1, 0);
-    else if (b->type == TYPEMULTIPART
-             || mutt_is_message_type (b->type, b->subtype))
+    else if (b->type == TYPEMULTIPART || mutt_is_message_type(b))
       attach_collapse (b->parts, collapse, i, 0);
     b->collapsed = collapse;
     if (just_one)
@@ -888,19 +815,6 @@ void mutt_attach_init (BODY * b)
   }
 }
 
-static const char *Function_not_permitted =
-N_("Function not permitted in attach-message mode.");
-
-#define CHECK_ATTACH if(option(OPTATTACHMSG)) \
-                    {\
-                       mutt_flushinp (); \
-                       mutt_error _(Function_not_permitted); \
-                       break; \
-                    }
-
-
-
-
 void mutt_view_attachments (HEADER * hdr)
 {
   int secured = 0;
@@ -952,8 +866,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
@@ -991,9 +905,23 @@ void mutt_view_attachments (HEADER * hdr)
   attach_collapse (cur, 0, 1, 0);
   mutt_update_attach_index (cur, &idx, &idxlen, &idxmax, menu);
 
+#define CHECK_READONLY \
+    if (Context->readonly) {                                            \
+        mutt_flushinp ();                                               \
+        mutt_error _("Mailbox is read-only.");                          \
+        break;                                                          \
+    }
+
+#define CHECK_ATTACH \
+    if (option(OPTATTACHMSG)) {                                         \
+        mutt_flushinp ();                                               \
+        mutt_error _("Function not permitted in attach-message mode."); \
+        break;                                                          \
+    }
+
   for (;;) {
     if (op == OP_NULL)
-      op = mutt_menuLoop (menu);
+      op = mutt_menuLoop(menu);
     switch (op) {
     case OP_ATTACH_VIEW_MAILCAP:
       mutt_view_attachment (fp, idx[menu->current]->content, M_MAILCAP,
@@ -1243,8 +1171,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);
@@ -1253,6 +1181,5 @@ void mutt_view_attachments (HEADER * hdr)
 
     op = OP_NULL;
   }
-
   /* not reached */
 }