rfc822 final touch
[apps/madmutt.git] / sendlib.c
index add4d74..b2d283d 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
 #include <lib-lib/macros.h>
 #include <lib-lib/file.h>
 
+#include <lib-mime/mime.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 <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);
@@ -122,15 +110,15 @@ static void encode_quoted (FGETCONV * fc, FILE * fout, int istext)
 
     /* Escape lines that begin with/only contain "the message separator". */
     if (linelen == 4 && !m_strncmp("From", line, 4)) {
-      strfcpy (line, "=46rom", sizeof (line));
+      m_strcpy(line, sizeof(line), "=46rom");
       linelen = 6;
     }
     else if (linelen == 4 && !m_strncmp("from", line, 4)) {
-      strfcpy (line, "=66rom", sizeof (line));
+      m_strcpy(line, sizeof(line), "=66rom");
       linelen = 6;
     }
     else if (linelen == 1 && line[0] == '.') {
-      strfcpy (line, "=2E", sizeof (line));
+      m_strcpy(line, sizeof(line), "=2E");
       linelen = 3;
     }
 
@@ -223,19 +211,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 +297,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 +349,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);
     }
@@ -396,7 +384,7 @@ int mutt_write_mime_body (BODY * a, FILE * f)
 
       return (-1);
     }
-    strfcpy (boundary, p, sizeof (boundary));
+    m_strcpy(boundary, sizeof(boundary), p);
 
     for (t = a->parts; t; t = t->next) {
       fprintf (f, "\n--%s\n", boundary);
@@ -457,7 +445,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);
@@ -904,13 +892,13 @@ int mutt_lookup_mime_type (BODY * att, const char *path)
       snprintf (buf, sizeof (buf), "%s/.mime.types", NONULL (Homedir));
       break;
     case 1:
-      strfcpy (buf, SYSCONFDIR "/muttng-mime.types", sizeof (buf));
+      m_strcpy(buf, sizeof(buf), SYSCONFDIR "/muttng-mime.types");
       break;
     case 2:
-      strfcpy (buf, PKGDATADIR "/mime.types", sizeof (buf));
+      m_strcpy(buf, sizeof(buf), PKGDATADIR "/mime.types");
       break;
     case 3:
-      strfcpy (buf, SYSCONFDIR "/mime.types", sizeof (buf));
+      m_strcpy(buf, sizeof(buf), SYSCONFDIR "/mime.types");
       break;
     default:
       debug_print (1, ("Internal error, count = %d.\n", count));
@@ -924,27 +912,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) {
@@ -958,7 +941,7 @@ int mutt_lookup_mime_type (BODY * att, const char *path)
             str_substrcpy (subtype, p, q, sizeof (subtype));
 
             if ((type = mutt_check_mime_type (ct)) == TYPEOTHER)
-              strfcpy (xtype, ct, sizeof (xtype));
+              m_strcpy(xtype, sizeof(xtype), ct);
 
             cur_sze = sze;
           }
@@ -1162,7 +1145,7 @@ char *mutt_get_body_charset (char *d, size_t dlen, BODY * b)
   if (p)
     mutt_canonical_charset (d, dlen, NONULL (p));
   else
-    strfcpy (d, "us-ascii", dlen);
+    m_strcpy(d, dlen, "us-ascii");
 
   return d;
 }
@@ -1389,10 +1372,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 +1579,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 +1624,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 +1926,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 +1949,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 +2005,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)
@@ -2088,8 +2069,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 +2148,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 +2190,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 +2201,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 +2255,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 +2282,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 +2311,7 @@ ADDRESS *mutt_remove_duplicates (ADDRESS * addr)
       *last = addr->next;
 
       addr->next = NULL;
-      rfc822_free_address (&addr);
+      address_delete (&addr);
 
       addr = *last;
     }