fix a segfault introduced by some nasty const /o\
[apps/madmutt.git] / send.c
diff --git a/send.c b/send.c
index 704b53b..32370e3 100644 (file)
--- a/send.c
+++ b/send.c
 #endif
 
 #include "mutt.h"
+#include "enter.h"
+#include "ascii.h"
 #include "mutt_curses.h"
 #include "rfc2047.h"
+#include "rfc3676.h"
 #include "keymap.h"
 #include "mime.h"
 #include "copy.h"
@@ -21,6 +24,7 @@
 #include "mutt_crypt.h"
 #include "mutt_idna.h"
 #include "url.h"
+#include "attach.h"
 
 #include "lib/mem.h"
 #include "lib/intl.h"
@@ -174,7 +178,7 @@ static ADDRESS *find_mailing_lists (ADDRESS * t, ADDRESS * c)
   return top;
 }
 
-static int edit_address (ADDRESS ** a, /* const */ char *field)
+static int edit_address (ADDRESS ** a, const char *field)
 {
   char buf[HUGE_STRING];
   char *err = NULL;
@@ -368,24 +372,6 @@ static void process_user_header (ENVELOPE * env)
   }
 }
 
-LIST *mutt_copy_list (LIST * p)
-{
-  LIST *t, *r = NULL, *l = NULL;
-
-  for (; p; p = p->next) {
-    t = (LIST *) mem_malloc (sizeof (LIST));
-    t->data = str_dup (p->data);
-    t->next = NULL;
-    if (l) {
-      r->next = t;
-      r = r->next;
-    }
-    else
-      l = r = t;
-  }
-  return (l);
-}
-
 void mutt_forward_intro (FILE * fp, HEADER * cur)
 {
   char buffer[STRING];
@@ -504,10 +490,9 @@ static int default_to (ADDRESS ** to, ENVELOPE * env, int flags, int hmfupto)
    */
   if (!(flags & SENDGROUPREPLY) && mutt_is_list_cc (0, env->to, env->cc)) {
     switch (query_quadoption (OPT_LISTREPLY,
-                              _
-                              ("Message came from a mailing list. Reply to author only?")))
+                              _("Message came from a mailing list. List-reply to mailing list?")))
     {
-    case M_NO:
+    case M_YES:
       tmp = find_mailing_lists (env->to, env->cc);
       rfc822_append (to, tmp);
       rfc822_free_address (&tmp);
@@ -641,6 +626,11 @@ void mutt_fix_reply_recipients (ENVELOPE * env)
   env->to = mutt_remove_duplicates (env->to);
   env->cc = mutt_remove_duplicates (env->cc);
   env->cc = mutt_remove_xrefs (env->to, env->cc);
+
+  if (env->cc && !env->to) {
+    env->to = env->cc;
+    env->cc = NULL;
+  }
 }
 
 void mutt_make_forward_subject (ENVELOPE * env, CONTEXT * ctx, HEADER * cur)
@@ -1079,6 +1069,19 @@ static void decode_descriptions (BODY * b)
   }
 }
 
+static void fix_end_of_file (const char *data)
+{
+  FILE *fp;
+  int c;
+
+  if ((fp = safe_fopen (data, "a+")) == NULL)
+    return;
+  fseeko (fp, -1, SEEK_END);
+  if ((c = fgetc (fp)) != '\n')
+    fputc ('\n', fp);
+  safe_fclose (&fp);
+}
+
 int mutt_resend_message (FILE * fp, CONTEXT * ctx, HEADER * cur)
 {
   HEADER *msg = mutt_new_header ();
@@ -1108,8 +1111,9 @@ int ci_send_message (int flags, /* send mode */
   char *pgpkeylist = NULL;
 
   /* save current value of "pgp_sign_as" */
-  char *signas = NULL;
-  char *tag = NULL, *err = NULL;
+  char *signas = NULL, *err = NULL;
+  const char *tag = NULL;
+  char *ctype;
 
   int rv = -1;
 
@@ -1190,13 +1194,20 @@ int ci_send_message (int flags, /* send mode */
     pbody->next = msg->content; /* don't kill command-line attachments */
     msg->content = pbody;
 
-    mutt_parse_content_type (ContentType, msg->content);
+    if (!(ctype = str_dup (ContentType)))
+      ctype = str_dup ("text/plain");
+    mutt_parse_content_type (ctype, msg->content);
+    mem_free (&ctype);
+
     msg->content->unlink = 1;
     msg->content->use_disp = 0;
     msg->content->disposition = DISPINLINE;
     if (option (OPTTEXTFLOWED) && msg->content->type == TYPETEXT
-        && !ascii_strcasecmp (msg->content->subtype, "plain"))
+        && !ascii_strcasecmp (msg->content->subtype, "plain")) {
       mutt_set_parameter ("format", "flowed", &msg->content->parameter);
+      if (option (OPTDELSP))
+        mutt_set_parameter ("delsp", "yes", &msg->content->parameter);
+    }
 
     if (!tempfile) {
       mutt_mktemp (buffer);
@@ -1435,9 +1446,10 @@ int ci_send_message (int flags, /* send mode */
          query_quadoption (OPT_FORWEDIT,
                            _("Edit forwarded message?")) == M_YES)) {
       /* If the this isn't a text message, look for a mailcap edit command */
-      if (mutt_needs_mailcap (msg->content))
-        mutt_edit_attachment (msg->content);
-      else if (!Editor || str_cmp ("builtin", Editor) == 0)
+      if (mutt_needs_mailcap (msg->content)) {
+        if (!mutt_edit_attachment (msg->content))
+          goto cleanup;
+      } else if (!Editor || str_cmp ("builtin", Editor) == 0)
         mutt_builtin_editor (msg->content->filename, msg, cur);
       else if (option (OPTEDITHDRS)) {
         mutt_env_to_local (msg->env);
@@ -1445,9 +1457,19 @@ int ci_send_message (int flags, /* send mode */
                            sizeof (fcc));
         mutt_env_to_idna (msg->env, NULL, NULL);
       }
-      else
+      else {
         mutt_edit_file (Editor, msg->content->filename);
 
+        if (stat (msg->content->filename, &st) == 0) {
+          if (mtime != st.st_mtime)
+            fix_end_of_file (msg->content->filename);
+        } else
+          mutt_perror (msg->content->filename);
+      }
+
+      if (option (OPTTEXTFLOWED))
+        rfc3676_space_stuff (msg);
+
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
     }
 
@@ -1590,6 +1612,20 @@ int ci_send_message (int flags, /* send mode */
   if (msg->content->next)
     msg->content = mutt_make_multipart (msg->content);
 
+  if (mutt_attach_check (msg) &&
+      !msg->content->next &&
+      query_quadoption (OPT_ATTACH,
+                        _("No attachments made but indicator found in text. "
+                          "Cancel sending?")) == M_YES) {
+    if (quadoption (OPT_ATTACH) == M_YES) {
+      mutt_message _("No attachments made but indicator found in text. "
+                     "Abort sending.");
+      sleep (2);
+    }
+    mutt_message (_("Mail not sent."));
+    goto main_loop;
+  }
+
   /* 
    * Ok, we need to do it this way instead of handling all fcc stuff in
    * one place in order to avoid going to main_loop with encoded "env"