diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-10-03 14:33:31 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-10-03 14:33:31 +0000 |
commit | 0df2550284908ae78bf4d71475b3952ecfe184db (patch) | |
tree | 3fbab252fdf93fc5fd35a8aabca407352c466b79 /mail | |
parent | 8e5eec0070d45dedc5c99ff51cc24af87b79e66f (diff) | |
download | mailutils-0df2550284908ae78bf4d71475b3952ecfe184db.tar.gz mailutils-0df2550284908ae78bf4d71475b3952ecfe184db.tar.bz2 |
(util_header_expand): New function. Expand the address-related fields of a header.
Diffstat (limited to 'mail')
-rw-r--r-- | mail/mail.h | 1 | ||||
-rw-r--r-- | mail/util.c | 111 |
2 files changed, 111 insertions, 1 deletions
diff --git a/mail/mail.h b/mail/mail.h index 3c4f136e1..3767639a1 100644 --- a/mail/mail.h +++ b/mail/mail.h @@ -297,6 +297,7 @@ extern void util_msgset_iterate __P ((msgset_t *msgset, int (*fun) __P ((message extern int util_get_content_type __P ((header_t hdr, char **value)); extern int util_get_hdr_value __P ((header_t hdr, const char *name, char **value)); extern int util_merge_addresses __P((char **addr_str, const char *value)); +extern int util_header_expand __P((header_t *hdr)); extern int ml_got_interrupt __P ((void)); extern void ml_clear_interrupt __P ((void)); diff --git a/mail/util.c b/mail/util.c index d4e20d229..ff999b88c 100644 --- a/mail/util.c +++ b/mail/util.c @@ -29,6 +29,7 @@ #else # include <sys/fcntl.h> #endif +#include <mu_asprintf.h> typedef struct _node { /* for the msglist expander */ @@ -1115,5 +1116,113 @@ util_merge_addresses (char **addr_str, const char *value) address_destroy (&new_addr); return rc; } + +static int +is_address_field (const char *name) +{ + static char *address_fields[] = { + MU_HEADER_TO, + MU_HEADER_CC, + MU_HEADER_BCC, + 0 + }; + char **p; + + for (p = address_fields; *p; p++) + if (strcasecmp (*p, name) == 0) + return 1; + return 0; +} + +int +util_header_expand (header_t *phdr) +{ + size_t i, nfields = 0; + header_t hdr; + int errcnt = 0, rc; - + rc = header_create (&hdr, "", 0, NULL); + if (rc) + { + util_error ("can't create temporary header: %s", mu_errstring (rc)); + return 1; + } + + header_get_field_count (*phdr, &nfields); + for (i = 1; i <= nfields; i++) + { + char *name, *value; + + if (header_aget_field_name (*phdr, i, &name)) + continue; + + if (header_aget_field_value (*phdr, i, &value)) + { + free (name); + continue; + } + + if (is_address_field (name)) + { + char *p, *s, *exp; + address_t addr = NULL; + + if (header_aget_value (hdr, name, &exp) == 0) + { + address_create (&addr, exp); + free (exp); + } + + for (p = strtok_r (value, ",", &s); p; p = strtok_r (NULL, ",", &s)) + { + address_t new_addr; + + while (*p && isspace (*p)) + p++; + exp = alias_expand (p); + rc = address_create (&new_addr, exp ? exp : p); + if (rc) + { + errcnt++; + if (exp) + util_error ("can't parse address `%s' (while expanding `%s'): %s", + exp, p, mu_errstring (rc)); + else + util_error ("can't parse address `%s': %s", + p, mu_errstring (rc)); + } + + free (exp); + address_union (&addr, new_addr); + address_destroy (&new_addr); + } + + if (addr) + { + size_t n = 0; + + free (value); + address_to_string (addr, NULL, 0, &n); + value = xmalloc (n + 1); + address_to_string (addr, value, n + 1, NULL); + address_destroy (&addr); + header_set_value (hdr, name, value, 1); + } + } + else + header_set_value (hdr, name, value, 0); + + free (value); + free (name); + } + + if (errcnt == 0) + { + header_destroy (phdr, NULL); + *phdr = hdr; + } + else + header_destroy (&hdr, NULL); + + return errcnt; +} |