#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
*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;
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;
- if (*s == '"')
- {
- (*tokenlen)++;
- return (s + 1);
- }
if (*s == '\\')
{
if (!*++s)
if (*tokenlen < tokenmax)
token[*tokenlen] = *s;
}
+ else if (*s == '"')
+ return (s + 1);
(*tokenlen)++;
s++;
}
char *comment, size_t *commentlen, size_t commentmax,
ADDRESS *addr)
{
- char token[STRING];
+ char token[LONG_STRING];
size_t tokenlen = 0;
SKIPWS (s);
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);
{
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;
}
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 ();
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);
- }
if ((ps = parse_route_addr (s + 1, comment, &commentlen, sizeof (comment) - 1, cur)) == NULL)
{
rfc822_free_address (&top);
{
if (*pc == '"' || *pc == '\\')
{
- if (!buflen)
- goto done;
*pbuf++ = '\\';
buflen--;
}
}
/* 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)
{
+ if (prune && addr->group && (!addr->next || !addr->next->mailbox))
+ {
+ addr = addr->next;
+ continue;
+ }
if (last)
{
last->next = rfc822_cpy_adr_real (addr);
}
/* 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;
if (!b)
return tmp;
if (tmp)
- tmp->next = rfc822_cpy_adr (b);
+ tmp->next = rfc822_cpy_adr (b, prune);
else
- tmp = *a = rfc822_cpy_adr (b);
+ tmp = *a = rfc822_cpy_adr (b, prune);
while (tmp && tmp->next)
tmp = tmp->next;
return tmp;
* domain-literal = "[" *(dtext / quoted-pair) "]"
*/
- char* dom;
unsigned int l, i;
if (!msgid || !*msgid)
return -1;
if (msgid[0] != '<' || msgid[l-1] != '>')
return -1;
- if (!(dom = strrchr (msgid, '@')))
+ if (!(strrchr (msgid, '@')))
return -1;
/* TODO: complete parser */