we're grownups now. don't care about stupid OS'es that don't know what an
[apps/madmutt.git] / sendlib.c
index 6ae0b6b..d55cd55 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
@@ -604,7 +604,7 @@ static size_t convert_file_to (FILE * file, const char *fromcode,
 #ifdef HAVE_ICONV
   iconv_t cd1, *cd;
   char bufi[256], bufu[512], bufo[4 * sizeof (bufi)];
-  ICONV_CONST char *ib, *ub;
+  const char *ib, *ub;
   char *ob;
   size_t ibl, obl, ubl, ubl1, n, ret;
   int i;
@@ -639,7 +639,7 @@ static size_t convert_file_to (FILE * file, const char *fromcode,
     /* Convert to UTF-8 */
     ib = bufi;
     ob = bufu, obl = sizeof (bufu);
-    n = iconv (cd1, ibl ? &ib : 0, &ibl, &ob, &obl);
+    n = my_iconv(cd1, ibl ? &ib : 0, &ibl, &ob, &obl);
     assert (n == (size_t) (-1) || !n || ICONV_NONTRANS);
     if (n == (size_t) (-1) &&
         ((errno != EINVAL && errno != E2BIG) || ib == bufi)) {
@@ -655,7 +655,7 @@ static size_t convert_file_to (FILE * file, const char *fromcode,
       if (cd[i] != (iconv_t) (-1) && score[i] != (size_t) (-1)) {
         ub = bufu, ubl = ubl1;
         ob = bufo, obl = sizeof (bufo);
-        n = iconv (cd[i], (ibl || ubl) ? &ub : 0, &ubl, &ob, &obl);
+        n = my_iconv(cd[i], (ibl || ubl) ? &ub : 0, &ubl, &ob, &obl);
         if (n == (size_t) (-1)) {
           assert (errno == E2BIG ||
                   (BUGGY_ICONV && (errno == EILSEQ || errno == ENOENT)));
@@ -892,7 +892,7 @@ int mutt_lookup_mime_type (BODY * att, const char *path)
 
   szf = str_len (path);
 
-  for (count = 0; count < 3; count++) {
+  for (count = 0; count < 4; count++) {
     /*
      * can't use strtok() because we use it in an inner loop below, so use
      * a switch statement here instead.
@@ -907,6 +907,9 @@ int mutt_lookup_mime_type (BODY * att, const char *path)
     case 2:
       strfcpy (buf, PKGDATADIR "/mime.types", sizeof (buf));
       break;
+    case 3:
+      strfcpy (buf, SYSCONFDIR "/mime.types", sizeof (buf));
+      break;
     default:
       debug_print (1, ("Internal error, count = %d.\n", count));
       goto bye;                 /* shouldn't happen */
@@ -1004,7 +1007,7 @@ void mutt_message_to_7bit (BODY * a, FILE * fp)
     goto cleanup;
   }
 
-  fseek (fpin, a->offset, 0);
+  fseeko (fpin, a->offset, 0);
   a->parts = mutt_parse_messageRFC822 (fpin, a);
 
   transform_to_7bit (a->parts, fpin);
@@ -1012,7 +1015,7 @@ void mutt_message_to_7bit (BODY * a, FILE * fp)
   mutt_copy_hdr (fpin, fpout, a->offset, a->offset + a->length,
                  CH_MIME | CH_NONEWLINE | CH_XMIT, NULL);
 
-  fputs ("Mime-Version: 1.0\n", fpout);
+  fputs ("MIME-Version: 1.0\n", fpout);
   mutt_write_mime_header (a->parts, fpout);
   fputc ('\n', fpout);
   mutt_write_mime_body (a->parts, fpout);
@@ -1471,6 +1474,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
   char *p;
   LIST *tmp = env->userhdrs;
   int has_agent = 0;            /* user defined user-agent header field exists */
+  list2_t* hdrs = list_from_str (EditorHeaders, " ");
 
 #ifdef USE_NNTP
   if (!option (OPTNEWSSEND))
@@ -1478,6 +1482,8 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
     if (mode == 0 && !privacy)
       fputs (mutt_make_date (buffer, sizeof (buffer)), fp);
 
+#define EDIT_HEADER(x) (mode != 1 || option(OPTXMAILTO) || (mode == 1 && list_lookup(hdrs,(list_lookup_t*) ascii_strcasecmp,x) >= 0))
+
   /* OPTUSEFROM is not consulted here so that we can still write a From:
    * field if the user sets it with the `my_hdr' command
    */
@@ -1495,7 +1501,8 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
 #ifdef USE_NNTP
     if (!option (OPTNEWSSEND))
 #endif
-      fputs ("To: \n", fp);
+      if (EDIT_HEADER("To:"))
+        fputs ("To:\n", fp);
 
   if (env->cc) {
     fputs ("Cc: ", fp);
@@ -1505,7 +1512,8 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
 #ifdef USE_NNTP
     if (!option (OPTNEWSSEND))
 #endif
-      fputs ("Cc: \n", fp);
+      if (EDIT_HEADER("Cc:"))
+        fputs ("Cc:\n", fp);
 
   if (env->bcc) {
     if (mode != 0 || option (OPTWRITEBCC)) {
@@ -1517,29 +1525,31 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
 #ifdef USE_NNTP
     if (!option (OPTNEWSSEND))
 #endif
-      fputs ("Bcc: \n", fp);
+      if (EDIT_HEADER("Bcc:"))
+        fputs ("Bcc:\n", fp);
 
 #ifdef USE_NNTP
   if (env->newsgroups)
     fprintf (fp, "Newsgroups: %s\n", env->newsgroups);
-  else if (mode == 1 && option (OPTNEWSSEND))
-    fputs ("Newsgroups: \n", fp);
+  else if (mode == 1 && option (OPTNEWSSEND) && EDIT_HEADER("Newsgroups:"))
+    fputs ("Newsgroups:\n", fp);
 
   if (env->followup_to)
     fprintf (fp, "Followup-To: %s\n", env->followup_to);
-  else if (mode == 1 && option (OPTNEWSSEND))
-    fputs ("Followup-To: \n", fp);
+  else if (mode == 1 && option (OPTNEWSSEND) && EDIT_HEADER("Followup-To:"))
+    fputs ("Followup-To:\n", fp);
 
   if (env->x_comment_to)
     fprintf (fp, "X-Comment-To: %s\n", env->x_comment_to);
-  else if (mode == 1 && option (OPTNEWSSEND) && option (OPTXCOMMENTTO))
-    fputs ("X-Comment-To: \n", fp);
+  else if (mode == 1 && option (OPTNEWSSEND) && option (OPTXCOMMENTTO) &&
+           EDIT_HEADER("X-Comment-To:"))
+    fputs ("X-Comment-To:\n", fp);
 #endif
 
   if (env->subject)
     fprintf (fp, "Subject: %s\n", env->subject);
-  else if (mode == 1)
-    fputs ("Subject: \n", fp);
+  else if (mode == 1 && EDIT_HEADER("Subject:"))
+    fputs ("Subject:\n", fp);
 
   /* save message id if the user has set it */
   if (env->message_id && !privacy)
@@ -1549,8 +1559,8 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
     fputs ("Reply-To: ", fp);
     mutt_write_address_list (env->reply_to, fp, 10, 0);
   }
-  else if (mode > 0)
-    fputs ("Reply-To: \n", fp);
+  else if (mode > 0 && EDIT_HEADER("Reply-To:"))
+    fputs ("Reply-To:\n", fp);
 
   if (env->mail_followup_to)
 #ifdef USE_NNTP
@@ -1569,7 +1579,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
     }
 
     /* Add the MIME headers */
-    fputs ("Mime-Version: 1.0\n", fp);
+    fputs ("MIME-Version: 1.0\n", fp);
     mutt_write_mime_header (attach, fp);
   }
 
@@ -1579,6 +1589,8 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
     fputc ('\n', fp);
   }
 
+#undef EDIT_HEADER
+
   /* Add any user defined headers */
   for (; tmp; tmp = tmp->next) {
     if ((p = strchr (tmp->data, ':'))) {
@@ -1615,9 +1627,11 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
       }
     }
     /* Add a vanity header */
-    fprintf (fp, "User-Agent: mutt-ng/%s (%s)\n", MUTT_VERSION, os);
+    fprintf (fp, "User-Agent: %s (%s)\n", mutt_make_version (0), os);
   }
 
+  list_del (&hdrs, (list_del_t*) _mem_free);
+
   return (ferror (fp) == 0 ? 0 : -1);
 }
 
@@ -1950,13 +1964,14 @@ static char **add_args (char **args, size_t * argslen, size_t * argsmax,
   return (args);
 }
 
-static char **add_option (char **args, size_t * argslen, size_t * argsmax,
-                          char *s)
+static char **add_option(char **args, size_t * argslen, size_t * argsmax,
+                         const char *s)
 {
-  if (*argslen == *argsmax)
-    mem_realloc (&args, (*argsmax += 5) * sizeof (char *));
-  args[(*argslen)++] = s;
-  return (args);
+    if (*argslen == *argsmax) {
+        mem_realloc(&args, (*argsmax += 5) * sizeof (char *));
+    }
+    args[(*argslen)++] = s;
+    return (args);
 }
 
 static int mutt_invoke_sendmail (ADDRESS * from,        /* the sender */
@@ -2014,9 +2029,16 @@ static int mutt_invoke_sendmail (ADDRESS * from,        /* the sender */
     if (eightbit && option (OPTUSE8BITMIME))
       args = add_option (args, &argslen, &argsmax, "-B8BITMIME");
 
-    if (option (OPTENVFROM) && from && !from->next) {
-      args = add_option (args, &argslen, &argsmax, "-f");
-      args = add_args (args, &argslen, &argsmax, from);
+    if (option (OPTENVFROM)) {
+      ADDRESS *f = NULL;
+      if (EnvFrom)
+        f = EnvFrom;
+      else if (from && !from->next)
+        f = from;
+      if (f) {
+        args = add_option (args, &argslen, &argsmax, "-f");
+        args = add_args (args, &argslen, &argsmax, f);
+      }
     }
     if (DsnNotify) {
       args = add_option (args, &argslen, &argsmax, "-N");
@@ -2078,8 +2100,11 @@ int mutt_invoke_mta (ADDRESS * from,    /* the sender */
                      int eightbit)
 {                               /* message contains 8bit chars */
 #ifdef USE_LIBESMTP
-  if (SmtpHost)
-    return mutt_libesmtp_invoke (from, to, cc, bcc, msg, eightbit);
+#ifdef USE_NNTP
+  if (!option (OPTNEWSSEND))
+#endif
+    if (SmtpHost)
+      return mutt_libesmtp_invoke (from, to, cc, bcc, msg, eightbit);
 #endif
 
   return mutt_invoke_sendmail (from, to, cc, bcc, msg, eightbit);
@@ -2233,7 +2258,7 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to,
     if (!option (OPTBOUNCEDELIVERED))
       ch_flags |= CH_WEED_DELIVERED;
 
-    fseek (fp, h->offset, 0);
+    fseeko (fp, h->offset, 0);
     fprintf (f, "Resent-From: %s", resent_from);
     fprintf (f, "\nResent-%s", mutt_make_date (date, sizeof (date)));
     if (MsgIdFormat && *MsgIdFormat)
@@ -2458,9 +2483,9 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid,
      * this will happen, and it can cause problems parsing the mailbox   
      * later.
      */
-    fseek (tempfp, -1, 2);
+    fseeko (tempfp, -1, 2);
     if (fgetc (tempfp) != '\n') {
-      fseek (tempfp, 0, 2);
+      fseeko (tempfp, 0, 2);
       fputc ('\n', tempfp);
     }
 
@@ -2479,7 +2504,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid,
     rewind (tempfp);
     while (fgets (sasha, sizeof (sasha), tempfp) != NULL)
       lines++;
-    fprintf (msg->fp, "Content-Length: %ld\n", (long) ftell (tempfp));
+    fprintf (msg->fp, "Content-Length: %zd\n", ftello (tempfp));
     fprintf (msg->fp, "Lines: %d\n\n", lines);
 
     /* copy the body and clean up */