diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-12-31 16:48:38 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-12-31 16:48:38 +0200 |
commit | f8a96930b6ec84c63b36e5789c9fdf74285f420c (patch) | |
tree | 2fa616a32e815270faacb5ffed0c4bd170fc0bbf /libmailutils | |
parent | 356c07542f39f1ff159e2646bd97e1791f493aad (diff) | |
download | mailutils-f8a96930b6ec84c63b36e5789c9fdf74285f420c.tar.gz mailutils-f8a96930b6ec84c63b36e5789c9fdf74285f420c.tar.bz2 |
Implement SMTPS.
* NEWS: Update.
* include/mailutils/registrar.h (mu_smtps_record): New extern.
(mu_register_all_mailer_formats): Register mu_smtps_record.
* include/mailutils/sys/registrar.h (MU_SMTPS_SCHEME)
(MU_SMTPS_SCHEME_LEN,MU_SMTPS_PORT): New defines.
* libmailutils/address/address.c (mu_address_get_count): Don't
count parts with NULL emails.
(mu_address_contains_email): Validate email before comparison.
(mu_list_copy): New static.
(mu_address_union): Reuse last subaddress if its email is NULL.
* libmailutils/base/nullrec.c (mu_smtps_record): New placeholder.
* libproto/mailer/smtp.c (mu_smtps_record): New global.
(smtp_open): Implement SMTPS
* mu/send.c: New file.
* mu/Makefile.am (MODULES): Add send.c
Diffstat (limited to 'libmailutils')
-rw-r--r-- | libmailutils/address/address.c | 115 | ||||
-rw-r--r-- | libmailutils/base/nullrec.c | 4 |
2 files changed, 75 insertions, 44 deletions
diff --git a/libmailutils/address/address.c b/libmailutils/address/address.c index 19c33fa46..f77230ac4 100644 --- a/libmailutils/address/address.c +++ b/libmailutils/address/address.c @@ -151,6 +151,18 @@ mu_address_createv (mu_address_t *a, const char *sv[], size_t len) return status; } +static void +_address_free (mu_address_t address) +{ + free (address->printable); + free (address->comments); + free (address->personal); + free (address->email); + free (address->local_part); + free (address->domain); + free (address->route); +} + void mu_address_destroy (mu_address_t *paddress) { @@ -160,21 +172,8 @@ mu_address_destroy (mu_address_t *paddress) mu_address_t current; for (; address; address = current) { - if (address->printable) - free (address->printable); - if (address->comments) - free (address->comments); - if (address->personal) - free (address->personal); - if (address->email) - free (address->email); - if (address->local_part) - free (address->local_part); - if (address->domain) - free (address->domain); - if (address->route) - free (address->route); current = address->next; + _address_free (address); free (address); } *paddress = NULL; @@ -642,11 +641,15 @@ mu_address_to_string (mu_address_t addr, char *buf, size_t len, size_t *n) int mu_address_get_count (mu_address_t addr, size_t *pcount) { - size_t j; - for (j = 0; addr; addr = addr->next, j++) - ; + size_t i, count = 0; + for (i = 0; addr; addr = addr->next, i++) + { + mu_validate_email (addr); + if (addr->email) + ++count; + } if (pcount) - *pcount = j; + *pcount = count; return 0; } @@ -696,37 +699,48 @@ int mu_address_contains_email (mu_address_t addr, const char *email) { for (; addr; addr = addr->next) - if (mu_c_strcasecmp (addr->email, email) == 0) - return 1; + { + mu_validate_email (addr); + if (!addr->email) + break; + if (mu_c_strcasecmp (addr->email, email) == 0) + return 1; + } return 0; } -mu_address_t -mu_address_dup (mu_address_t src) +static int +mu_list_copy (mu_address_t dst, mu_address_t src) { - mu_address_t dst = calloc (1, sizeof (*dst)); - - if (!dst) - return NULL; - /* FIXME: How about: if (src->printable) dst->printable = strdup (src->printable); ? */ - if (src->comments) - dst->comments = strdup (src->comments); - if (src->personal) - dst->personal = strdup (src->personal); - if (src->email) - dst->email = strdup (src->email); - if (src->local_part) - dst->local_part = strdup (src->local_part); - if (src->domain) - dst->domain = strdup (src->domain); - if (src->route) - dst->route = strdup (src->route); + if (src->comments && !(dst->comments = strdup (src->comments))) + return ENOMEM; + if (src->personal && !(dst->personal = strdup (src->personal))) + return ENOMEM; + if (src->email && !(dst->email = strdup (src->email))) + return ENOMEM; + if (src->local_part && !(dst->local_part = strdup (src->local_part))) + return ENOMEM; + if (src->domain && !(dst->domain = strdup (src->domain))) + return ENOMEM; + if (src->route && !(dst->route = strdup (src->route))) + return ENOMEM; + return 0; +} +mu_address_t +mu_address_dup (mu_address_t src) +{ + mu_address_t dst = calloc (1, sizeof (*dst)); + + if (!dst) + return NULL; + if (mu_list_copy (dst, src)) + mu_address_destroy (&dst); return dst; } @@ -760,11 +774,24 @@ mu_address_union (mu_address_t *a, mu_address_t b) for (; b; b = b->next) if (!mu_address_contains_email (*a, b->email)) { - mu_address_t next = mu_address_dup (b); - if (!next) - return ENOMEM; - last->next = next; - last = next; + if (last->email) + { + mu_address_t next = mu_address_dup (b); + if (!next) + return ENOMEM; + last->next = next; + last = next; + } + else + { + int rc = mu_list_copy (last, b); + if (rc) + { + _address_free (last); + memset (last, 0, sizeof (last)); + return rc; + } + } } return 0; } diff --git a/libmailutils/base/nullrec.c b/libmailutils/base/nullrec.c index a507a245d..80aadbf0a 100644 --- a/libmailutils/base/nullrec.c +++ b/libmailutils/base/nullrec.c @@ -47,3 +47,7 @@ mu_record_t mu_mh_record = NULL; mu_record_t mu_maildir_record = NULL; #endif +#ifndef WITH_TLS +mu_record_t mu_smtps_record = NULL; +#endif + |