workaround a stupid issue in how decoding is performed in mutt *sigh*
[apps/madmutt.git] / headers.c
index 59370cf..b083ded 100644 (file)
--- a/headers.c
+++ b/headers.c
@@ -1,36 +1,24 @@
-/* 
+/*
+ * Copyright notice from original mutt:
  * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
- * 
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- * 
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- * 
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
  */
 
+#include <lib-lib/lib-lib.h>
+#include <lib-ui/lib-ui.h>
+
 #include "mutt.h"
-#include "mutt_crypt.h"
+#include "alias.h"
+#include "crypt.h"
 #include "mutt_idna.h"
 
-#include <sys/stat.h>
-#include <string.h>
-#include <ctype.h>
-
-void mutt_edit_headers (const char *editor,
-                       const char *body,
-                       HEADER *msg,
-                       char *fcc,
-                       size_t fcclen)
+void mutt_edit_headers(const char *body,
+                       HEADER * msg, char *fcc, ssize_t fcclen)
 {
-  char path[_POSIX_PATH_MAX];  /* tempfile used to edit headers + body */
+  char path[_POSIX_PATH_MAX];   /* tempfile used to edit headers + body */
   char buffer[LONG_STRING];
   char *p;
   FILE *ifp, *ofp;
@@ -38,86 +26,77 @@ void mutt_edit_headers (const char *editor,
   ENVELOPE *n;
   time_t mtime;
   struct stat st;
-  LIST *cur, **last = NULL, *tmp;
+  string_list_t *cur, **last = NULL, *tmp;
 
-  mutt_mktemp (path);
-  if ((ofp = safe_fopen (path, "w")) == NULL)
-  {
+  ofp = m_tempfile(path, sizeof(path), NONULL(mod_core.tmpdir), NULL);
+  if (!ofp) {
     mutt_perror (path);
     return;
   }
-  
+
   mutt_env_to_local (msg->env);
-  mutt_write_rfc822_header (ofp, msg->env, NULL, 1, 0);
-  fputc ('\n', ofp);   /* tie off the header. */
+  mutt_write_rfc822_header (ofp, msg->env, NULL, 1);
+  fputc ('\n', ofp);            /* tie off the header. */
 
   /* now copy the body of the message. */
-  if ((ifp = fopen (body, "r")) == NULL)
-  {
+  if ((ifp = fopen (body, "r")) == NULL) {
     mutt_perror (body);
     return;
   }
 
   mutt_copy_stream (ifp, ofp);
 
-  fclose (ifp);
-  fclose (ofp);
+  m_fclose(&ifp);
+  m_fclose(&ofp);
 
-  if (stat (path, &st) == -1)
-  {
+  if (stat (path, &st) == -1) {
     mutt_perror (path);
     return;
   }
 
-  mtime = mutt_decrease_mtime (path, &st);
+  mtime = m_decrease_mtime(path, &st);
 
-  mutt_edit_file (editor, path);
+  mutt_edit_file(path);
   stat (path, &st);
-  if (mtime == st.st_mtime)
-  {
-    dprint (1, (debugfile, "ci_edit_headers(): temp file was not modified.\n"));
+  if (mtime == st.st_mtime) {
     /* the file has not changed! */
     mutt_unlink (path);
     return;
   }
 
   mutt_unlink (body);
-  mutt_free_list (&msg->env->userhdrs);
+  string_list_wipe(&msg->env->userhdrs);
 
   /* Read the temp file back in */
-  if ((ifp = fopen (path, "r")) == NULL)
-  {
+  if ((ifp = fopen (path, "r")) == NULL) {
     mutt_perror (path);
     return;
   }
-  
-  if ((ofp = safe_fopen (body, "w")) == NULL)
-  {
+
+  if ((ofp = safe_fopen (body, "w")) == NULL) {
     /* intentionally leak a possible temporary file here */
-    fclose (ifp);
+    m_fclose(&ifp);
     mutt_perror (body);
     return;
   }
-  
+
   n = mutt_read_rfc822_header (ifp, NULL, 1, 0);
   while ((i = fread (buffer, 1, sizeof (buffer), ifp)) > 0)
     fwrite (buffer, 1, i, ofp);
-  fclose (ofp);
-  fclose (ifp);
+  m_fclose(&ofp);
+  m_fclose(&ifp);
   mutt_unlink (path);
 
   /* restore old info. */
   n->references = msg->env->references;
   msg->env->references = NULL;
 
-  mutt_free_envelope (&msg->env);
-  msg->env = n; n = NULL;
+  envelope_delete(&msg->env);
+  msg->env = n;
+  n = NULL;
 
   if (!msg->env->in_reply_to)
-#ifdef USE_NNTP
-  if (!option (OPTNEWSSEND))
-#endif
-    mutt_free_list (&msg->env->references);
+    string_list_wipe(&msg->env->references);
 
   mutt_expand_aliases_env (msg->env);
 
@@ -127,80 +106,66 @@ void mutt_edit_headers (const char *editor,
 
   cur = msg->env->userhdrs;
   last = &msg->env->userhdrs;
-  while (cur)
-  {
+  while (cur) {
     keep = 1;
 
     /* keep track of whether or not we see the in-reply-to field.  if we did
      * not, remove the references: field later so that we can generate a new
      * message based upon this one.
      */
-    if (fcc && ascii_strncasecmp ("fcc:", cur->data, 4) == 0)
-    {
-      p = cur->data + 4;
-      SKIPWS (p);
-      if (*p)
-      {
-       strfcpy (fcc, p, fcclen);
-       mutt_pretty_mailbox (fcc);
+    if (fcc && ascii_strncasecmp ("fcc:", cur->data, 4) == 0) {
+      p = vskipspaces(cur->data + 4);
+      if (*p) {
+        m_strcpy(fcc, fcclen, p);
+        mutt_pretty_mailbox (fcc);
       }
       keep = 0;
     }
-    else if (ascii_strncasecmp ("attach:", cur->data, 7) == 0)
-    {
-      BODY *body;
+    else if (ascii_strncasecmp ("attach:", cur->data, 7) == 0) {
+      BODY *bbody;
       BODY *parts;
       char *q;
 
-      p = cur->data + 7;
-      SKIPWS (p);
-      if (*p)
-      {
-       if ((q = strpbrk (p, " \t")))
-       {
-         mutt_substrcpy (path, p, q, sizeof (path));
-         SKIPWS (q);
-       }
-       else
-         strfcpy (path, p, sizeof (path));
-       mutt_expand_path (path, sizeof (path));
-       if ((body = mutt_make_file_attach (path)))
-       {
-         body->description = safe_strdup (q);
-         for (parts = msg->content; parts->next; parts = parts->next) ;
-         parts->next = body;
-       }
-       else
-       {
-         mutt_pretty_mailbox (path);
-         mutt_error (_("%s: unable to attach file"), path);
-       }
+      p = vskipspaces(cur->data + 7);
+      if (*p) {
+        if ((q = strpbrk (p, " \t"))) {
+          m_strncpy(path, sizeof(path), p, q - p);
+          q = vskipspaces(q);
+        }
+        else
+          m_strcpy(path, sizeof(path), p);
+        mutt_expand_path (path, sizeof (path));
+        if ((bbody = mutt_make_file_attach (path))) {
+          bbody->description = m_strdup(q);
+          for (parts = msg->content; parts->next; parts = parts->next);
+          parts->next = bbody;
+        }
+        else {
+          mutt_pretty_mailbox (path);
+          mutt_error (_("%s: unable to attach file"), path);
+        }
       }
       keep = 0;
     }
 
 
-    else if ((WithCrypto & APPLICATION_PGP)
-             &&ascii_strncasecmp ("pgp:", cur->data, 4) == 0)
-    {
+    else if (ascii_strncasecmp("pgp:", cur->data, 4) == 0) {
       msg->security = mutt_parse_crypt_hdr (cur->data + 4, 0);
       if (msg->security)
-       msg->security |= APPLICATION_PGP;
+        msg->security |= APPLICATION_PGP;
       keep = 0;
     }
 
-    if (keep)
-    {
+    if (keep) {
       last = &cur->next;
-      cur  = cur->next;
+      cur = cur->next;
     }
-    else
-    {
-      tmp       = cur;
-      *last     = cur->next;
-      cur       = cur->next;
+    else {
+      tmp = cur;
+      *last = cur->next;
+      cur = cur->next;
       tmp->next = NULL;
-      mutt_free_list (&tmp);
+      string_list_wipe(&tmp);
     }
   }
 }