move mutt_strsysexit into lib-sys/exit.[hc]
[apps/madmutt.git] / sendlib.c
index 1daf044..e6c0359 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
 # include "config.h"
 #endif
 
+#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-lib/debug.h>
+
+#include <lib-sys/exit.h>
+
+#include <lib-mime/mime.h>
+
+#include <lib-ui/curses.h>
 
 #include "mutt.h"
 #include "handler.h"
 #include "recvattach.h"
-#include "mutt_curses.h"
-#include "rfc2047.h"
-#include "rfc2231.h"
 #include "mx.h"
-#include "mime.h"
 #include "copy.h"
 #include "pager.h"
 #include "charset.h"
-#include "mutt_crypt.h"
+#include <lib-crypt/crypt.h>
 #include "mutt_idna.h"
 
-#include "lib/debug.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>
-
 #ifdef USE_LIBESMTP
 # include "mutt_libesmtp.h"
 #endif /* USE_LIBESMTP */
 #include <assert.h>
 #endif
 
-extern char RFC822Specials[];
-
 #define DISPOSITION(X) X==DISPATTACH?"attachment":"inline"
 
-const char MimeSpecials[] = "@.,;:<>[]\\\"()?/= \t";
-
-char B64Chars[64] = {
-  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
-  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
-  'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
-  't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
-  '8', '9', '+', '/'
-};
-
 static char MsgIdPfx = 'A';
 
 static void transform_to_7bit (BODY * a, FILE * fpin);
@@ -223,19 +212,19 @@ static void b64_flush (FILE * fout)
   for (i = b64_num; i < 3; i++)
     b64_buffer[i] = '\0';
 
-  fputc (B64Chars[(b64_buffer[0] >> 2) & 0x3f], fout);
+  fputc(__m_b64chars[(b64_buffer[0] >> 2) & 0x3f], fout);
   b64_linelen++;
-  fputc (B64Chars
+  fputc(__m_b64chars
          [((b64_buffer[0] & 0x3) << 4) | ((b64_buffer[1] >> 4) & 0xf)], fout);
   b64_linelen++;
 
   if (b64_num > 1) {
-    fputc (B64Chars
+    fputc (__m_b64chars
            [((b64_buffer[1] & 0xf) << 2) | ((b64_buffer[2] >> 6) & 0x3)],
            fout);
     b64_linelen++;
     if (b64_num > 2) {
-      fputc (B64Chars[b64_buffer[2] & 0x3f], fout);
+      fputc (__m_b64chars[b64_buffer[2] & 0x3f], fout);
       b64_linelen++;
     }
   }
@@ -309,7 +298,7 @@ int mutt_write_mime_header (BODY * a, FILE * f)
       buffer[0] = 0;
       tmp = m_strdup(p->value);
       encode = rfc2231_encode_string (&tmp);
-      rfc822_cat (buffer, sizeof (buffer), tmp, MimeSpecials);
+      rfc822_strcpy(buffer, sizeof(buffer), tmp, MimeSpecials);
 
       /* Dirty hack to make messages readable by Outlook Express 
        * for the Mac: force quotes around the boundary parameter
@@ -361,7 +350,7 @@ int mutt_write_mime_header (BODY * a, FILE * f)
       buffer[0] = 0;
       tmp = m_strdup(t);
       encode = rfc2231_encode_string (&tmp);
-      rfc822_cat (buffer, sizeof (buffer), tmp, MimeSpecials);
+      rfc822_strcpy(buffer, sizeof(buffer), tmp, MimeSpecials);
       p_delete(&tmp);
       fprintf (f, "; filename%s=%s", encode ? "*" : "", buffer);
     }
@@ -376,9 +365,7 @@ 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) \
-                                 || ((WithCrypto & APPLICATION_PGP)\
-                                      && mutt_is_application_pgp(a)))
+# 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)
 {
@@ -411,9 +398,7 @@ int mutt_write_mime_body (BODY * a, FILE * f)
   }
 
   /* This is pretty gross, but it's the best solution for now... */
-  if ((WithCrypto & APPLICATION_PGP)
-      && a->type == TYPEAPPLICATION
-      && m_strcmp(a->subtype, "pgp-encrypted") == 0) {
+  if (a->type == TYPEAPPLICATION && !m_strcmp(a->subtype, "pgp-encrypted")) {
     fputs ("Version: 1\n", f);
     return 0;
   }
@@ -457,7 +442,7 @@ void mutt_generate_boundary (PARAMETER ** parm)
 
   rs[BOUNDARYLEN] = 0;
   for (i = 0; i < BOUNDARYLEN; i++)
-    *p++ = B64Chars[LRAND () % sizeof (B64Chars)];
+    *p++ = __m_b64chars[LRAND() % sizeof(__m_b64chars)];
   *p = 0;
 
   mutt_set_parameter ("boundary", rs, parm);
@@ -757,7 +742,7 @@ static size_t convert_file_from_to (FILE * file,
   for (c = tocodes, i = 0; c; c = c1 ? c1 + 1 : 0, i++) {
     if ((c1 = strchr (c, ':')) == c)
       continue;
-    tcode[i] = str_substrdup (c, c1);
+    tcode[i] = m_substrdup(c, c1);
   }
 
   ret = (size_t) (-1);
@@ -766,7 +751,7 @@ static size_t convert_file_from_to (FILE * file,
     for (c = fromcodes; c; c = c1 ? c1 + 1 : 0) {
       if ((c1 = strchr (c, ':')) == c)
         continue;
-      fcode = str_substrdup (c, c1);
+      fcode = m_substrdup(c, c1);
 
       ret = convert_file_to (file, fcode, ncodes, (const char **) tcode,
                              &cn, info);
@@ -904,7 +889,7 @@ int mutt_lookup_mime_type (BODY * att, const char *path)
       snprintf (buf, sizeof (buf), "%s/.mime.types", NONULL (Homedir));
       break;
     case 1:
-      m_strcpy(buf, sizeof(buf), SYSCONFDIR "/muttng-mime.types");
+      m_strcpy(buf, sizeof(buf), SYSCONFDIR "/madmutt-mime.types");
       break;
     case 2:
       m_strcpy(buf, sizeof(buf), PKGDATADIR "/mime.types");
@@ -924,27 +909,22 @@ int mutt_lookup_mime_type (BODY * att, const char *path)
           *p = 0;
 
         /* remove any leading space. */
-        ct = buf;
-        SKIPWS (ct);
+        ct = vskipspaces(buf);
 
         /* position on the next field in this line */
         if ((p = strpbrk (ct, " \t")) == NULL)
           continue;
         *p++ = 0;
-        SKIPWS (p);
+        p = vskipspaces(p);
 
         /* cycle through the file extensions */
         while ((p = strtok (p, " \t\n"))) {
           sze = m_strlen(p);
           if ((sze > cur_sze) && (szf >= sze) &&
               (m_strcasecmp(path + szf - sze, p) == 0
-               || ascii_strcasecmp (path + szf - sze, p) == 0) && (szf == sze
-                                                                   || path[szf
-                                                                           -
-                                                                           sze
-                                                                           -
-                                                                           1]
-                                                                   == '.')) {
+               || ascii_strcasecmp (path + szf - sze, p) == 0)
+              && (szf == sze || path[szf - sze - 1] == '.'))
+          {
             /* get the content-type */
 
             if ((p = strchr (ct, '/')) == NULL) {
@@ -955,7 +935,7 @@ int mutt_lookup_mime_type (BODY * att, const char *path)
 
             for (q = p; *q && !ISSPACE (*q); q++);
 
-            str_substrcpy (subtype, p, q, sizeof (subtype));
+            m_strncpy(subtype, sizeof(subtype), p, q - p);
 
             if ((type = mutt_check_mime_type (ct)) == TYPEOTHER)
               m_strcpy(xtype, sizeof(xtype), ct);
@@ -973,8 +953,8 @@ bye:
 
   if (type != TYPEOTHER || *xtype != '\0') {
     att->type = type;
-    str_replace (&att->subtype, subtype);
-    str_replace (&att->xtype, xtype);
+    m_strreplace(&att->subtype, subtype);
+    m_strreplace(&att->xtype, xtype);
   }
 
   return (type);
@@ -1198,14 +1178,12 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg)
   BODY *body;
   FILE *fp;
   int cmflags, chflags;
-  int pgp = WithCrypto ? hdr->security : 0;
+  int pgp = hdr->security;
 
-  if (WithCrypto) {
-    if ((option (OPTMIMEFORWDECODE) || option (OPTFORWDECRYPT)) &&
-        (hdr->security & ENCRYPT)) {
-      if (!crypt_valid_passphrase (hdr->security))
-        return (NULL);
-    }
+  if ((option (OPTMIMEFORWDECODE) || option (OPTFORWDECRYPT)) &&
+      (hdr->security & ENCRYPT)) {
+    if (!crypt_valid_passphrase (hdr->security))
+      return (NULL);
   }
 
   mutt_mktemp (buffer);
@@ -1230,26 +1208,20 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg)
   if (!attach_msg && option (OPTMIMEFORWDECODE)) {
     chflags |= CH_MIME | CH_TXTPLAIN;
     cmflags = M_CM_DECODE | M_CM_CHARCONV;
-    if ((WithCrypto & APPLICATION_PGP))
-      pgp &= ~PGPENCRYPT;
-    if ((WithCrypto & APPLICATION_SMIME))
-      pgp &= ~SMIMEENCRYPT;
+    pgp &= ~(PGPENCRYPT|SMIMEENCRYPT);
   }
-  else if (WithCrypto && option (OPTFORWDECRYPT) && (hdr->security & ENCRYPT)) {
-    if ((WithCrypto & APPLICATION_PGP)
-        && mutt_is_multipart_encrypted (hdr->content)) {
+  else if (option (OPTFORWDECRYPT) && (hdr->security & ENCRYPT)) {
+    if (mutt_is_multipart_encrypted (hdr->content)) {
       chflags |= CH_MIME | CH_NONEWLINE;
       cmflags = M_CM_DECODE_PGP;
       pgp &= ~PGPENCRYPT;
     }
-    else if ((WithCrypto & APPLICATION_PGP)
-             && (mutt_is_application_pgp (hdr->content) & PGPENCRYPT)) {
+    else if (mutt_is_application_pgp (hdr->content) & PGPENCRYPT) {
       chflags |= CH_MIME | CH_TXTPLAIN;
       cmflags = M_CM_DECODE | M_CM_CHARCONV;
       pgp &= ~PGPENCRYPT;
     }
-    else if ((WithCrypto & APPLICATION_SMIME)
-             && mutt_is_application_smime (hdr->content) & SMIMEENCRYPT) {
+    else if (mutt_is_application_smime (hdr->content) & SMIMEENCRYPT) {
       chflags |= CH_MIME | CH_TXTPLAIN;
       cmflags = M_CM_DECODE | M_CM_CHARCONV;
       pgp &= ~SMIMEENCRYPT;
@@ -1261,12 +1233,11 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg)
   fflush (fp);
   rewind (fp);
 
-  body->hdr = mutt_new_header ();
+  body->hdr = header_new();
   body->hdr->offset = 0;
   /* we don't need the user headers here */
   body->hdr->env = mutt_read_rfc822_header (fp, body->hdr, 0, 0);
-  if (WithCrypto)
-    body->hdr->security = pgp;
+  body->hdr->security = pgp;
   mutt_update_encoding (body);
   body->parts = body->hdr->content;
 
@@ -1389,10 +1360,10 @@ char *mutt_make_date (char *s, size_t len)
 
 /* wrapper around mutt_write_address() so we can handle very large
    recipient lists without needing a huge temporary buffer in memory */
-void mutt_write_address_list (ADDRESS * adr, FILE * fp, int linelen,
+void mutt_write_address_list (address_t * adr, FILE * fp, int linelen,
                               int display)
 {
-  ADDRESS *tmp;
+  address_t *tmp;
   char buf[LONG_STRING];
   int count = 0;
   int len;
@@ -1596,8 +1567,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach,
   /* Add any user defined headers */
   for (; tmp; tmp = tmp->next) {
     if ((p = strchr (tmp->data, ':'))) {
-      p++;
-      SKIPWS (p);
+      p = vskipspaces(p + 1);
       if (!*p)
         continue;               /* don't emit empty fields. */
 
@@ -1642,8 +1612,7 @@ static void encode_headers (LIST * h)
       continue;
 
     i = p - h->data;
-    ++p;
-    SKIPWS (p);
+    p = vskipspaces(p + 1);
     tmp = m_strdup(p);
 
     if (!tmp)
@@ -1945,7 +1914,7 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile)
 }
 
 static const char **
-add_args(const char **args, size_t *argslen, size_t *argsmax, ADDRESS * addr)
+add_args(const char **args, size_t *argslen, size_t *argsmax, address_t * addr)
 {
   for (; addr; addr = addr->next) {
     /* weed out group mailboxes, since those are for display only */
@@ -1968,8 +1937,8 @@ add_option(const char **args, size_t *argslen, size_t *argsmax, const char *s)
     return (args);
 }
 
-static int mutt_invoke_sendmail (ADDRESS * from,        /* the sender */
-                                 ADDRESS * to, ADDRESS * cc, ADDRESS * bcc,     /* recips */
+static int mutt_invoke_sendmail (address_t * from,        /* the sender */
+                                 address_t * to, address_t * cc, address_t * bcc,     /* recips */
                                  const char *msg,       /* file containing message */
                                  int eightbit)
 {                               /* message contains 8bit chars */
@@ -2024,7 +1993,7 @@ static int mutt_invoke_sendmail (ADDRESS * from,        /* the sender */
       args = add_option(args, &argslen, &argsmax, "-B8BITMIME");
 
     if (option (OPTENVFROM)) {
-      ADDRESS *f = NULL;
+      address_t *f = NULL;
       if (EnvFrom)
         f = EnvFrom;
       else if (from && !from->next)
@@ -2057,11 +2026,8 @@ static int mutt_invoke_sendmail (ADDRESS * from,        /* the sender */
 
   if ((i = send_msg (path, args, msg, &childout)) != (EX_OK & 0xff)) {
     if (i != S_BKG) {
-      const char *e = mutt_strsysexit (i);
-
-      e = mutt_strsysexit (i);
       mutt_error (_("Error sending message, child exited %d (%s)."), i,
-                  NONULL (e));
+                  m_strsysexit(i));
       if (childout) {
         struct stat st;
 
@@ -2088,8 +2054,8 @@ static int mutt_invoke_sendmail (ADDRESS * from,        /* the sender */
   return (i);
 }
 
-int mutt_invoke_mta (ADDRESS * from,    /* the sender */
-                     ADDRESS * to, ADDRESS * cc, ADDRESS * bcc, /* recips */
+int mutt_invoke_mta (address_t * from,    /* the sender */
+                     address_t * to, address_t * cc, address_t * bcc, /* recips */
                      const char *msg,   /* file containing message */
                      int eightbit)
 {                               /* message contains 8bit chars */
@@ -2167,13 +2133,13 @@ void mutt_prepare_envelope (ENVELOPE * env, int final)
        * recipients if there is no To: or Cc: field, so attempt to suppress
        * it by using an empty To: field.
        */
-      env->to = rfc822_new_address ();
+      env->to = address_new ();
       env->to->group = 1;
-      env->to->next = rfc822_new_address ();
+      env->to->next = address_new ();
 
       buffer[0] = 0;
-      rfc822_cat (buffer, sizeof (buffer), "undisclosed-recipients",
-                  RFC822Specials);
+      rfc822_strcpy(buffer, sizeof(buffer), "undisclosed-recipients",
+                    RFC822Specials);
 
       env->to->mailbox = m_strdup(buffer);
     }
@@ -2209,7 +2175,7 @@ void mutt_unprepare_envelope (ENVELOPE * env)
   for (item = env->userhdrs; item; item = item->next)
     rfc2047_decode (&item->data);
 
-  rfc822_free_address (&env->mail_followup_to);
+  address_delete (&env->mail_followup_to);
 
   /* back conversions */
   rfc2047_decode_adrlist (env->to);
@@ -2220,8 +2186,8 @@ void mutt_unprepare_envelope (ENVELOPE * env)
   rfc2047_decode (&env->subject);
 }
 
-static int _mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to,
-                                 const char *resent_from, ADDRESS * env_from)
+static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to,
+                                 const char *resent_from, address_t * env_from)
 {
   int i, ret = 0;
   FILE *f;
@@ -2274,9 +2240,9 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to,
   return ret;
 }
 
-int mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to)
+int mutt_bounce_message (FILE * fp, HEADER * h, address_t * to)
 {
-  ADDRESS *from;
+  address_t *from;
   const char *fqdn = mutt_fqdn (1);
   char resent_from[STRING];
   int ret;
@@ -2301,18 +2267,18 @@ int mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to)
 
   ret = _mutt_bounce_message (fp, h, to, resent_from, from);
 
-  rfc822_free_address (&from);
+  address_delete (&from);
 
   return ret;
 }
 
 
 /* given a list of addresses, return a list of unique addresses */
-ADDRESS *mutt_remove_duplicates (ADDRESS * addr)
+address_t *mutt_remove_duplicates (address_t * addr)
 {
-  ADDRESS *top = addr;
-  ADDRESS **last = &top;
-  ADDRESS *tmp;
+  address_t *top = addr;
+  address_t **last = &top;
+  address_t *tmp;
   int dup;
 
   while (addr) {
@@ -2330,7 +2296,7 @@ ADDRESS *mutt_remove_duplicates (ADDRESS * addr)
       *last = addr->next;
 
       addr->next = NULL;
-      rfc822_free_address (&addr);
+      address_delete (&addr);
 
       addr = *last;
     }
@@ -2417,8 +2383,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid,
 
 
   /* (postponment) if the mail is to be signed or encrypted, save this info */
-  if ((WithCrypto & APPLICATION_PGP)
-      && post && (hdr->security & APPLICATION_PGP)) {
+  if (post && (hdr->security & APPLICATION_PGP)) {
     fputs ("X-Mutt-PGP: ", msg->fp);
     if (hdr->security & ENCRYPT)
       fputc ('E', msg->fp);
@@ -2433,8 +2398,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid,
   }
 
   /* (postponment) if the mail is to be signed or encrypted, save this info */
-  if ((WithCrypto & APPLICATION_SMIME)
-      && post && (hdr->security & APPLICATION_SMIME)) {
+  if (post && (hdr->security & APPLICATION_SMIME)) {
     fputs ("X-Mutt-SMIME: ", msg->fp);
     if (hdr->security & ENCRYPT) {
       fputc ('E', msg->fp);