I don't care about systems where atimes are broken.
[apps/madmutt.git] / sendlib.c
index e5bb57f..6f40ea1 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
@@ -9,34 +9,18 @@
 
 #define _SENDLIB_C 1
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <lib-lib/lib-lib.h>
 
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <ctype.h>
-#include <sys/stat.h>
 #include <signal.h>
-#include <sys/wait.h>
-#include <fcntl.h>
 #include <sys/utsname.h>
 
-#include <lib-lib/mem.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/str.h>
-#include <lib-lib/macros.h>
-#include <lib-lib/file.h>
-
 #include <lib-sys/exit.h>
 #include <lib-sys/mutt_signal.h>
-
 #include <lib-mime/mime.h>
-
 #include <lib-ui/curses.h>
 
+#include <lib-crypt/crypt.h>
+
 #include "mutt.h"
 #include "handler.h"
 #include "recvattach.h"
@@ -44,7 +28,6 @@
 #include "copy.h"
 #include "pager.h"
 #include "charset.h"
-#include <lib-crypt/crypt.h>
 #include "mutt_idna.h"
 
 #ifdef USE_LIBESMTP
@@ -364,8 +347,6 @@ int mutt_write_mime_header (BODY * a, FILE * f)
   return (ferror (f) ? -1 : 0);
 }
 
-# define write_as_text_part(a)  (mutt_is_text_part(a) || mutt_is_application_pgp(a))
-
 int mutt_write_mime_body (BODY * a, FILE * f)
 {
   const char *p;
@@ -414,6 +395,7 @@ int mutt_write_mime_body (BODY * a, FILE * f)
   else
     fc = fgetconv_open (fpin, 0, 0, 0);
 
+#define write_as_text_part(a)  (mutt_is_text_part(a) || mutt_is_application_pgp(a))
   if (a->encoding == ENCQUOTEDPRINTABLE)
     encode_quoted (fc, f, write_as_text_part (a));
   else if (a->encoding == ENCBASE64)
@@ -422,6 +404,7 @@ int mutt_write_mime_body (BODY * a, FILE * f)
     encode_8bit (fc, f, write_as_text_part (a));
   else
     mutt_copy_stream (fpin, f);
+#undef write_as_text_part
 
   fgetconv_close (&fc);
   fclose (fpin);
@@ -429,8 +412,6 @@ int mutt_write_mime_body (BODY * a, FILE * f)
   return (ferror (f) ? -1 : 0);
 }
 
-#undef write_as_text_part
-
 typedef struct {
   int from;
   int whitespace;
@@ -1095,22 +1076,16 @@ void mutt_stamp_attachment (BODY * a)
 
 /* Get a body's character set */
 
-char *mutt_get_body_charset (char *d, ssize_t dlen, BODY * b)
+char *mutt_get_body_charset(char *d, ssize_t dlen, BODY * b)
 {
-  const char *p = NULL;
+    const char *p;
 
-  if (b && b->type != TYPETEXT)
-    return NULL;
-
-  if (b)
-    p = parameter_getval(b->parameter, "charset");
-
-  if (p)
-    charset_canonicalize (d, dlen, p);
-  else
-    m_strcpy(d, dlen, "us-ascii");
+    if (b && b->type != TYPETEXT)
+        return NULL;
 
-  return d;
+    p = b ? parameter_getval(b->parameter, "charset") : NULL;
+    charset_canonicalize(d, dlen, p);
+    return d;
 }
 
 
@@ -1223,23 +1198,8 @@ BODY *mutt_make_file_attach (const char *path)
   /* Attempt to determine the appropriate content-type based on the filename
    * suffix.
    */
-
-#if 0
-
-  if ((n =
-       mutt_lookup_mime_type (buf, sizeof (buf), xbuf, sizeof (xbuf),
-                              path)) != TYPEOTHER || *xbuf != '\0') {
-    att->type = n;
-    att->subtype = m_strdup(buf);
-    att->xtype = m_strdup(xbuf);
-  }
-
-#else
-
   mutt_lookup_mime_type (att, path);
 
-#endif
-
   if ((info = mutt_get_content_info (path, att)) == NULL) {
     body_list_wipe(&att);
     return NULL;
@@ -1254,15 +1214,14 @@ BODY *mutt_make_file_attach (const char *path)
        */
       att->type = TYPETEXT;
       att->subtype = m_strdup("plain");
-    }
-    else {
+    } else {
       att->type = TYPEAPPLICATION;
       att->subtype = m_strdup("octet-stream");
     }
   }
 
   mutt_update_encoding (att);
-  return (att);
+  return att;
 }
 
 static int get_toplevel_encoding (BODY * a)
@@ -1390,6 +1349,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.
@@ -1413,7 +1390,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))
@@ -1421,8 +1397,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
    */
@@ -1440,7 +1414,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) {
@@ -1451,7 +1425,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) {
@@ -1464,30 +1438,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 */
@@ -1498,7 +1472,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)
@@ -1528,8 +1502,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, ':'))) {
@@ -1562,8 +1534,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);
 }
 
@@ -1711,7 +1681,7 @@ 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];
@@ -1774,17 +1744,8 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile)
     setsid ();
 
     /* next we close all open files */
-#if defined(OPEN_MAX)
-    for (fd = 0; fd < OPEN_MAX; fd++)
-      close (fd);
-#elif defined(_POSIX_OPEN_MAX)
-    for (fd = 0; fd < _POSIX_OPEN_MAX; fd++)
+    for (fd = 0; fd < getdtablesize(); fd++)
       close (fd);
-#else
-    close (0);
-    close (1);
-    close (2);
-#endif
 
     /* now the second fork() */
     if ((pid = fork ()) == 0) {
@@ -2187,41 +2148,6 @@ int mutt_bounce_message (FILE * fp, HEADER * h, address_t * to)
   return ret;
 }
 
-
-/* given a list of addresses, return a list of unique addresses */
-address_t *mutt_remove_duplicates (address_t * addr)
-{
-  address_t *top = addr;
-  address_t **last = &top;
-  address_t *tmp;
-  int dodup = 0;
-
-  while (addr) {
-    for (tmp = top; tmp && tmp != addr; tmp = tmp->next) {
-      if (tmp->mailbox && addr->mailbox &&
-          !ascii_strcasecmp (addr->mailbox, tmp->mailbox)) {
-        dodup = 1;
-        break;
-      }
-    }
-
-    if (dodup) {
-      *last = addr->next;
-
-      addr->next = NULL;
-      address_list_wipe(&addr);
-
-      addr = *last;
-    }
-    else {
-      last = &addr->next;
-      addr = addr->next;
-    }
-  }
-
-  return (top);
-}
-
 static void set_noconv_flags (BODY * b, short flag)
 {
   for (; b; b = b->next) {