remove some mutt_mktemp
[apps/madmutt.git] / sendlib.c
index ae595c3..042ca3a 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
@@ -7,8 +7,6 @@
  * please see the file GPL in the top level source directory.
  */
 
-#define _SENDLIB_C 1
-
 #include <lib-lib/lib-lib.h>
 
 #include <signal.h>
 #include <lib-sys/mutt_signal.h>
 #include <lib-mime/mime.h>
 #include <lib-ui/curses.h>
+#include <lib-mx/mx.h>
+
+#include <lib-crypt/crypt.h>
 
 #include "mutt.h"
 #include "handler.h"
 #include "recvattach.h"
-#include "mx.h"
 #include "copy.h"
 #include "pager.h"
 #include "charset.h"
-#include <lib-crypt/crypt.h>
 #include "mutt_idna.h"
 
 #ifdef USE_LIBESMTP
@@ -34,7 +33,7 @@
 #endif /* USE_LIBESMTP */
 
 #ifdef USE_NNTP
-#include <nntp.h>
+#include <nntp/nntp.h>
 #endif
 
 #ifdef HAVE_SYSEXITS_H
 #define EX_OK 0
 #endif
 
-/* If you are debugging this file, comment out the following line. */
-/*#define NDEBUG*/
-
-#ifdef NDEBUG
-#define assert(x)
-#else
-#include <assert.h>
-#endif
-
-#define DISPOSITION(X) X==DISPATTACH?"attachment":"inline"
-
 static void transform_to_7bit (BODY * a, FILE * fpin);
 
 static void encode_quoted (fgetconv_t * fc, FILE * fout, int istext)
@@ -313,6 +301,7 @@ int mutt_write_mime_header (BODY * a, FILE * f)
   if (a->description)
     fprintf (f, "Content-Description: %s\n", a->description);
 
+#define DISPOSITION(X) X==DISPATTACH?"attachment":"inline"
   fprintf (f, "Content-Disposition: %s", DISPOSITION (a->disposition));
 
   if (a->use_disp) {
@@ -587,10 +576,7 @@ static ssize_t convert_file_to (FILE * file, const char *fromcode,
     ib = bufi;
     ob = bufu, obl = sizeof (bufu);
     n = my_iconv(cd1, ibl ? &ib : 0, &ibl, &ob, &obl);
-    assert (n == -1 || !n);
     if (n == -1 && ((errno != EINVAL && errno != E2BIG) || ib == bufi)) {
-      assert (errno == EILSEQ ||
-              (errno == EINVAL && ib == bufi && ibl < ssizeof (bufi)));
       ret = -1;
       break;
     }
@@ -937,9 +923,9 @@ void mutt_message_to_7bit (BODY * a, FILE * fp)
     a->length = sb.st_size;
   }
 
-  mutt_mktemp (temp);
-  if (!(fpout = safe_fopen (temp, "w+"))) {
-    mutt_perror ("fopen");
+  fpout = m_tempfile(temp, sizeof(temp), NONULL(Tempdir), NULL);
+  if (!fpout) {
+    mutt_error(_("Could not create temporary file"));
     goto cleanup;
   }
 
@@ -1002,9 +988,9 @@ static void transform_to_7bit (BODY * a, FILE * fpin)
       a->noconv = 1;
       a->force_charset = 1;
 
-      mutt_mktemp (buff);
-      if ((s.fpout = safe_fopen (buff, "w")) == NULL) {
-        mutt_perror ("fopen");
+      s.fpout = m_tempfile(buff, sizeof(buff), NONULL(Tempdir), NULL);
+      if (!s.fpout) {
+        mutt_error(_("Could not create temporary file"));
         return;
       }
       s.fpin = fpin;
@@ -1348,6 +1334,24 @@ void mutt_write_references (string_list_t * r, FILE * f)
   p_delete(&ref);
 }
 
+static int edit_header(int mode, const char *s)
+{
+    const char *p;
+    int slen = m_strlen(s);
+
+    if (mode != 1 || option(OPTXMAILTO))
+        return 1;
+
+    p = skipspaces(EditorHeaders);
+    while (*p) {
+        if (!ascii_strncasecmp(p, s, slen) && p[slen - 1] == ':')
+            return 1;
+        p = skipspaces(p + slen);
+    }
+
+    return 0;
+}
+
 /* Note: all RFC2047 encoding should be done outside of this routine, except
  * for the "real name."  This will allow this routine to be used more than
  * once, if necessary.
@@ -1371,7 +1375,6 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
   char *p;
   string_list_t *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))
@@ -1379,8 +1382,6 @@ 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
    */
@@ -1398,7 +1399,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
 #ifdef USE_NNTP
     if (!option (OPTNEWSSEND))
 #endif
-      if (EDIT_HEADER("To:"))
+      if (edit_header(mode, "To:"))
         fputs ("To:\n", fp);
 
   if (env->cc) {
@@ -1409,7 +1410,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
 #ifdef USE_NNTP
     if (!option (OPTNEWSSEND))
 #endif
-      if (EDIT_HEADER("Cc:"))
+      if (edit_header(mode, "Cc:"))
         fputs ("Cc:\n", fp);
 
   if (env->bcc) {
@@ -1422,30 +1423,30 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
 #ifdef USE_NNTP
     if (!option (OPTNEWSSEND))
 #endif
-      if (EDIT_HEADER("Bcc:"))
+      if (edit_header(mode, "Bcc:"))
         fputs ("Bcc:\n", fp);
 
 #ifdef USE_NNTP
   if (env->newsgroups)
     fprintf (fp, "Newsgroups: %s\n", env->newsgroups);
-  else if (mode == 1 && option (OPTNEWSSEND) && EDIT_HEADER("Newsgroups:"))
+  else if (mode == 1 && option (OPTNEWSSEND) && edit_header(mode, "Newsgroups:"))
     fputs ("Newsgroups:\n", fp);
 
   if (env->followup_to)
     fprintf (fp, "Followup-To: %s\n", env->followup_to);
-  else if (mode == 1 && option (OPTNEWSSEND) && EDIT_HEADER("Followup-To:"))
+  else if (mode == 1 && option (OPTNEWSSEND) && edit_header(mode, "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) &&
-           EDIT_HEADER("X-Comment-To:"))
+           edit_header(mode, "X-Comment-To:"))
     fputs ("X-Comment-To:\n", fp);
 #endif
 
   if (env->subject)
     fprintf (fp, "Subject: %s\n", env->subject);
-  else if (mode == 1 && EDIT_HEADER("Subject:"))
+  else if (mode == 1 && edit_header(mode, "Subject:"))
     fputs ("Subject:\n", fp);
 
   /* save message id if the user has set it */
@@ -1456,7 +1457,7 @@ 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 && EDIT_HEADER("Reply-To:"))
+  else if (mode > 0 && edit_header(mode, "Reply-To:"))
     fputs ("Reply-To:\n", fp);
 
   if (env->mail_followup_to)
@@ -1486,8 +1487,6 @@ 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, ':'))) {
@@ -1520,8 +1519,6 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
     fprintf (fp, "User-Agent: %s (%s)\n", mutt_make_version (0), os);
   }
 
-  list_del (&hdrs, (list_del_t*)xmemfree);
-
   return (ferror (fp) == 0 ? 0 : -1);
 }
 
@@ -1669,22 +1666,18 @@ static void mutt_gen_localpart(char *buf, unsigned int len, const char *fmt)
 #undef APPEND_FMT
 }
 
-char *mutt_gen_msgid (void)
+static char *mutt_gen_msgid (void)
 {
   char buf[SHORT_STRING];
   char localpart[SHORT_STRING];
-  unsigned int localpart_length;
   const char *fqdn;
 
-  if (!(fqdn = mutt_fqdn (0)))
-    fqdn = NONULL (Hostname);
-
-  localpart_length = sizeof (buf) - m_strlen(fqdn) - 4;  /* the 4 characters are '<', '@', '>' and '\0' */
+  if (!(fqdn = mutt_fqdn(0)))
+    fqdn = NONULL(Hostname);
 
-  mutt_gen_localpart (localpart, localpart_length, MsgIdFormat);
-
-  snprintf (buf, sizeof (buf), "<%s@%s>", localpart, fqdn);
-  return (m_strdup(buf));
+  mutt_gen_localpart(localpart, sizeof(localpart), MsgIdFormat);
+  snprintf(buf, sizeof(buf), "<%s@%s>", localpart, fqdn);
+  return m_strdup(buf);
 }
 
 static RETSIGTYPE alarm_handler (int sig)
@@ -2075,8 +2068,8 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to,
   if (!fp)
     fp = msg->fp;
 
-  mutt_mktemp (tempfile);
-  if ((f = safe_fopen (tempfile, "w")) != NULL) {
+  f = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+  if (f) {
     int ch_flags = CH_XMIT | CH_NONEWLINE | CH_NOQFROM;
 
     if (!option (OPTBOUNCEDELIVERED))
@@ -2094,8 +2087,8 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to,
     mutt_copy_bytes (fp, f, h->content->length);
     fclose (f);
 
-    ret = mutt_invoke_mta (env_from, to, NULL, NULL, tempfile,
-                           h->content->encoding == ENC8BIT);
+    ret = mutt_invoke_mta(env_from, to, NULL, NULL, tempfile,
+                          h->content->encoding == ENC8BIT);
   }
 
   if (msg)
@@ -2167,11 +2160,11 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid,
    * the message body begins with "From "   
    */
   if (f.magic == M_MMDF || f.magic == M_MBOX) {
-    mutt_mktemp (tempfile);
-    if ((tempfp = safe_fopen (tempfile, "w+")) == NULL) {
-      mutt_perror (tempfile);
+    tempfp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+    if (!tempfp) {
+      mutt_error(_("Could not create temporary file"));
       mx_close_mailbox (&f, NULL);
-      return (-1);
+      return -1;
     }
   }