]> git.llucax.com Git - software/mutt-debian.git/blobdiff - rfc822.c
adding another override, the binary is actually a symlink
[software/mutt-debian.git] / rfc822.c
index 4500e67da915375ae3ce9e509384aeae917bd894..eca2d7de5667a27396844ef59a8ca56b76d66df9 100644 (file)
--- a/rfc822.c
+++ b/rfc822.c
@@ -33,7 +33,7 @@
 #define FREE(x) safe_free(x)
 #define ISSPACE isspace
 #define strfcpy(a,b,c) {if (c) {strncpy(a,b,c);a[c-1]=0;}}
 #define FREE(x) safe_free(x)
 #define ISSPACE isspace
 #define strfcpy(a,b,c) {if (c) {strncpy(a,b,c);a[c-1]=0;}}
-#define STRING 128
+#define LONG_STRING 1024
 #include "rfc822.h"
 #endif
 
 #include "rfc822.h"
 #endif
 
@@ -82,6 +82,46 @@ void rfc822_dequote_comment (char *s)
   *w = 0;
 }
 
   *w = 0;
 }
 
+static void free_address (ADDRESS *a)
+{
+  FREE(&a->personal);
+  FREE(&a->mailbox);
+#ifdef EXACT_ADDRESS
+  FREE(&a->val);
+#endif
+  FREE(&a);
+}
+
+int rfc822_remove_from_adrlist (ADDRESS **a, const char *mailbox)
+{
+  ADDRESS *p, *last = NULL, *t;
+  int rv = -1;
+
+  p = *a;
+  last = NULL;
+  while (p)
+  {
+    if (ascii_strcasecmp (mailbox, p->mailbox) == 0)
+    {
+      if (last)
+       last->next = p->next;
+      else
+       (*a) = p->next;
+      t = p;
+      p = p->next;
+      free_address (t);
+      rv = 0;
+    }
+    else
+    {
+      last = p;
+      p = p->next;
+    }
+  }
+
+  return (rv);
+}
+
 void rfc822_free_address (ADDRESS **p)
 {
   ADDRESS *t;
 void rfc822_free_address (ADDRESS **p)
 {
   ADDRESS *t;
@@ -137,17 +177,10 @@ parse_comment (const char *s,
 static const char *
 parse_quote (const char *s, char *token, size_t *tokenlen, size_t tokenmax)
 {
 static const char *
 parse_quote (const char *s, char *token, size_t *tokenlen, size_t tokenmax)
 {
-  if (*tokenlen < tokenmax)
-    token[(*tokenlen)++] = '"';
   while (*s)
   {
     if (*tokenlen < tokenmax)
       token[*tokenlen] = *s;
   while (*s)
   {
     if (*tokenlen < tokenmax)
       token[*tokenlen] = *s;
-    if (*s == '"')
-    {
-      (*tokenlen)++;
-      return (s + 1);
-    }
     if (*s == '\\')
     {
       if (!*++s)
     if (*s == '\\')
     {
       if (!*++s)
@@ -156,6 +189,8 @@ parse_quote (const char *s, char *token, size_t *tokenlen, size_t tokenmax)
       if (*tokenlen < tokenmax)
        token[*tokenlen] = *s;
     }
       if (*tokenlen < tokenmax)
        token[*tokenlen] = *s;
     }
+    else if (*s == '"')
+      return (s + 1);
     (*tokenlen)++;
     s++;
   }
     (*tokenlen)++;
     s++;
   }
@@ -256,7 +291,7 @@ parse_route_addr (const char *s,
                  char *comment, size_t *commentlen, size_t commentmax,
                  ADDRESS *addr)
 {
                  char *comment, size_t *commentlen, size_t commentmax,
                  ADDRESS *addr)
 {
-  char token[STRING];
+  char token[LONG_STRING];
   size_t tokenlen = 0;
 
   SKIPWS (s);
   size_t tokenlen = 0;
 
   SKIPWS (s);
@@ -304,7 +339,7 @@ parse_addr_spec (const char *s,
                 char *comment, size_t *commentlen, size_t commentmax,
                 ADDRESS *addr)
 {
                 char *comment, size_t *commentlen, size_t commentmax,
                 ADDRESS *addr)
 {
-  char token[STRING];
+  char token[LONG_STRING];
   size_t tokenlen = 0;
 
   s = parse_address (s, token, &tokenlen, sizeof (token) - 1, comment, commentlen, commentmax, addr);
   size_t tokenlen = 0;
 
   s = parse_address (s, token, &tokenlen, sizeof (token) - 1, comment, commentlen, commentmax, addr);
@@ -339,7 +374,7 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS *top, const char *s)
 {
   int ws_pending, nl;
   const char *begin, *ps;
 {
   int ws_pending, nl;
   const char *begin, *ps;
-  char comment[STRING], phrase[STRING];
+  char comment[LONG_STRING], phrase[LONG_STRING];
   size_t phraselen = 0, commentlen = 0;
   ADDRESS *cur, *last = NULL;
   
   size_t phraselen = 0, commentlen = 0;
   ADDRESS *cur, *last = NULL;
   
@@ -391,6 +426,17 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS *top, const char *s)
       }
       s = ps;
     }
       }
       s = ps;
     }
+    else if (*s == '"')
+    {
+      if (phraselen && phraselen < sizeof (phrase) - 1)
+        phrase[phraselen++] = ' ';
+      if ((ps = parse_quote (s + 1, phrase, &phraselen, sizeof (phrase) - 1)) == NULL)
+      {
+        rfc822_free_address (&top);
+        return NULL;
+      }
+      s = ps;
+    }
     else if (*s == ':')
     {
       cur = rfc822_new_address ();
     else if (*s == ':')
     {
       cur = rfc822_new_address ();
@@ -450,13 +496,7 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS *top, const char *s)
       terminate_buffer (phrase, phraselen);
       cur = rfc822_new_address ();
       if (phraselen)
       terminate_buffer (phrase, phraselen);
       cur = rfc822_new_address ();
       if (phraselen)
-      {
-       if (cur->personal)
-         FREE (&cur->personal);
-       /* if we get something like "Michael R. Elkins" remove the quotes */
-       rfc822_dequote_comment (phrase);
        cur->personal = safe_strdup (phrase);
        cur->personal = safe_strdup (phrase);
-      }
       if ((ps = parse_route_addr (s + 1, comment, &commentlen, sizeof (comment) - 1, cur)) == NULL)
       {
        rfc822_free_address (&top);
       if ((ps = parse_route_addr (s + 1, comment, &commentlen, sizeof (comment) - 1, cur)) == NULL)
       {
        rfc822_free_address (&top);
@@ -594,8 +634,6 @@ void rfc822_write_address_single (char *buf, size_t buflen, ADDRESS *addr,
       {
        if (*pc == '"' || *pc == '\\')
        {
       {
        if (*pc == '"' || *pc == '\\')
        {
-         if (!buflen)
-           goto done;
          *pbuf++ = '\\';
          buflen--;
        }
          *pbuf++ = '\\';
          buflen--;
        }
@@ -759,12 +797,17 @@ ADDRESS *rfc822_cpy_adr_real (ADDRESS *addr)
 }
 
 /* this should be rfc822_cpy_adrlist */
 }
 
 /* this should be rfc822_cpy_adrlist */
-ADDRESS *rfc822_cpy_adr (ADDRESS *addr)
+ADDRESS *rfc822_cpy_adr (ADDRESS *addr, int prune)
 {
   ADDRESS *top = NULL, *last = NULL;
   
   for (; addr; addr = addr->next)
   {
 {
   ADDRESS *top = NULL, *last = NULL;
   
   for (; addr; addr = addr->next)
   {
+    if (prune && addr->group && (!addr->next || !addr->next->mailbox))
+    {
+      addr = addr->next;
+      continue;
+    }
     if (last)
     {
       last->next = rfc822_cpy_adr_real (addr);
     if (last)
     {
       last->next = rfc822_cpy_adr_real (addr);
@@ -777,7 +820,7 @@ ADDRESS *rfc822_cpy_adr (ADDRESS *addr)
 }
 
 /* append list 'b' to list 'a' and return the last element in the new list */
 }
 
 /* append list 'b' to list 'a' and return the last element in the new list */
-ADDRESS *rfc822_append (ADDRESS **a, ADDRESS *b)
+ADDRESS *rfc822_append (ADDRESS **a, ADDRESS *b, int prune)
 {
   ADDRESS *tmp = *a;
 
 {
   ADDRESS *tmp = *a;
 
@@ -786,9 +829,9 @@ ADDRESS *rfc822_append (ADDRESS **a, ADDRESS *b)
   if (!b)
     return tmp;
   if (tmp)
   if (!b)
     return tmp;
   if (tmp)
-    tmp->next = rfc822_cpy_adr (b);
+    tmp->next = rfc822_cpy_adr (b, prune);
   else
   else
-    tmp = *a = rfc822_cpy_adr (b);
+    tmp = *a = rfc822_cpy_adr (b, prune);
   while (tmp && tmp->next)
     tmp = tmp->next;
   return tmp;
   while (tmp && tmp->next)
     tmp = tmp->next;
   return tmp;
@@ -818,7 +861,6 @@ int rfc822_valid_msgid (const char *msgid)
    * domain-literal = "[" *(dtext / quoted-pair) "]"
    */
 
    * domain-literal = "[" *(dtext / quoted-pair) "]"
    */
 
-  char* dom;
   unsigned int l, i;
 
   if (!msgid || !*msgid)
   unsigned int l, i;
 
   if (!msgid || !*msgid)
@@ -829,7 +871,7 @@ int rfc822_valid_msgid (const char *msgid)
     return -1;
   if (msgid[0] != '<' || msgid[l-1] != '>')
     return -1;
     return -1;
   if (msgid[0] != '<' || msgid[l-1] != '>')
     return -1;
-  if (!(dom = strrchr (msgid, '@')))
+  if (!(strrchr (msgid, '@')))
     return -1;
 
   /* TODO: complete parser */
     return -1;
 
   /* TODO: complete parser */