diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-03-11 14:11:31 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-03-11 14:11:31 +0000 |
commit | 5c50702cdf6552db0098564009f3b49c3ce80df1 (patch) | |
tree | 4ee6cebcd2d63bcf8671c895ab1004a9f16b46ae | |
parent | c36e5d80431856468390961d580d9f7ca2629fd4 (diff) | |
download | mailutils-5c50702cdf6552db0098564009f3b49c3ce80df1.tar.gz mailutils-5c50702cdf6552db0098564009f3b49c3ce80df1.tar.bz2 |
Added to the repository
-rw-r--r-- | mh/mh_whom.c | 184 | ||||
-rw-r--r-- | mh/whom.c | 120 |
2 files changed, 304 insertions, 0 deletions
diff --git a/mh/mh_whom.c b/mh/mh_whom.c new file mode 100644 index 000000000..32d373501 --- /dev/null +++ b/mh/mh_whom.c @@ -0,0 +1,184 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2003 Free Software Foundation, Inc. + + GNU Mailutils is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Mailutils is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Mailutils; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include <mh.h> + +struct recipient { + char *addr; + int isbcc; +}; + +static list_t local_rcp; /* Local recipients */ +static list_t network_rcp; /* Network recipients */ + +static void +addrcp (list_t *list, char *addr, int isbcc) +{ + int rc; + struct recipient *p = xmalloc (sizeof (*p)); + p->addr = addr; + p->isbcc = isbcc; + if (!*list && (rc = list_create (list))) + { + mh_error (_("can't create list: %s"), mu_strerror (rc)); + exit (1); + } + list_append (*list, p); +} + +static int +ismydomain (char *p) +{ + char *domain; + if (!p) + return 1; + mu_get_user_email_domain (&domain); + return strcasecmp (domain, p + 1) == 0; +} + +static void +scan_addrs (char *str, int isbcc) +{ + address_t addr; + size_t i, count; + + address_create (&addr, str); + address_get_count (addr, &count); + for (i = 1; i <= count; i++) + { + char *buf, *p; + int rc; + rc = address_aget_email (addr, i, &buf); + if (rc) + { + mh_error ("address_aget_email: %s", mu_strerror (rc)); + continue; + } + p = strchr (buf, '@'); + if (ismydomain (p)) + addrcp (&local_rcp, buf, isbcc); + else + addrcp (&network_rcp, buf, isbcc); + } + address_destroy (&addr); + free (str); /* FIXME: This will disappear. Note comment to + mh_context_get_value! */ +} + +static int +_destroy_recipient (void *item, void *unused_data) +{ + struct recipient *p = item; + free (p->addr); + free (p); + return 0; +} + +static void +destroy_addrs (list_t *list) +{ + if (!*list) + return; + list_do (*list, _destroy_recipient, NULL); + list_destroy (list); +} + +/* Print an email in more readable form: localpart + "at" + domain */ +static void +print_readable (char *email, int islocal) +{ + printf (" "); + for (; *email && *email != '@'; email++) + putchar (*email); + + if (!*email || islocal) + return; + + printf (_(" at %s"), email+1); +} + +static int +_print_recipient (void *item, void *data) +{ + struct recipient *p = item; + size_t *count = data; + + print_readable (p->addr, 0); + if (p->isbcc) + printf ("[BCC]"); + printf ("\n"); + (*count)++; + return 0; +} + +static int +_print_local_recipient (void *item, void *data) +{ + struct recipient *p = item; + size_t *count = data; + + print_readable (p->addr, 1); + if (p->isbcc) + printf ("[BCC]"); + printf ("\n"); + (*count)++; + return 0; +} + +int +mh_whom (char *filename, int check) +{ + int rc = 0; + mh_context_t *ctx; + + ctx = mh_context_create (filename, 1); + if (mh_context_read (ctx)) + { + mh_error (_("malformed message")); + rc = -1; + } + else + { + size_t count = 0; + + scan_addrs (mh_context_get_value (ctx, MU_HEADER_TO, NULL), 0); + scan_addrs (mh_context_get_value (ctx, MU_HEADER_CC, NULL), 0); + scan_addrs (mh_context_get_value (ctx, MU_HEADER_BCC, NULL), 1); + + if (local_rcp) + { + printf (" %s\n", _("-- Local Recipients --")); + list_do (local_rcp, _print_local_recipient, &count); + } + + if (network_rcp) + { + printf (" %s\n", _("-- Network Recipients --")); + list_do (network_rcp, _print_recipient, &count); + } + + if (count == 0) + { + mh_error(_("No recipients")); + rc = -1; + } + } + free (ctx); + destroy_addrs (&network_rcp); + destroy_addrs (&local_rcp); + return rc; +} diff --git a/mh/whom.c b/mh/whom.c new file mode 100644 index 000000000..0ea61929c --- /dev/null +++ b/mh/whom.c @@ -0,0 +1,120 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2003 Free Software Foundation, Inc. + + GNU Mailutils is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Mailutils is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Mailutils; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include <mh.h> + +const char *argp_program_version = "whom (" PACKAGE_STRING ")"; +static char doc[] = N_("GNU MH whom\v" +"Use -help to obtain the list of traditional MH options."); +static char args_doc[] = "[file]"; + +/* GNU options */ +static struct argp_option options[] = { + {"alias", ARG_ALIAS, N_("FILE"), 0, + N_("* Specify additional alias file") }, + {"draft", ARG_DRAFT, NULL, 0, + N_("Use prepared draft") }, + {"draftfolder", ARG_DRAFTFOLDER, N_("FOLDER"), 0, + N_("Specify the folder for message drafts") }, + {"draftmessage", ARG_DRAFTMESSAGE, NULL, 0, + N_("Treat the arguments as a list of messages from the draftfolder") }, + {"nodraftfolder", ARG_NODRAFTFOLDER, NULL, 0, + N_("Undo the effect of the last --draftfolder option") }, + {"check", ARG_CHECK, N_("BOOL"), OPTION_ARG_OPTIONAL, + N_("Check if addresses are deliverable") }, + {"nocheck", ARG_NOCHECK, NULL, OPTION_HIDDEN, "" }, + {NULL} +}; + +/* Traditional MH options */ +struct mh_option mh_option[] = { + {"alias", 1, 0, "aliasfile" }, + {"draft", 5, 0, NULL }, + {"draftfolder", 6, 0, "folder" }, + {"draftmessage", 6, 0, "message"}, + {"nodraftfolder", 3, 0, NULL }, + {"check", 1, 0, MH_OPT_BOOL, NULL}, + {NULL} +}; + +static int check_recipients; +static int use_draft; /* Use the prepared draft */ +static char *draft_folder; /* Use this draft folder */ + +static int +opt_handler (int key, char *arg, void *unused, struct argp_state *state) +{ + switch (key) + { + case ARG_ALIAS: + return 1; + + case ARG_DRAFT: + use_draft = 1; + break; + + case ARG_DRAFTFOLDER: + draft_folder = arg; + break; + + case ARG_NODRAFTFOLDER: + draft_folder = NULL; + break; + + case ARG_DRAFTMESSAGE: + if (!draft_folder) + draft_folder = mh_global_profile_get ("Draft-Folder", + mu_path_folder_dir); + break; + + case ARG_CHECK: + check_recipients = is_true (arg); + break; + + case ARG_NOCHECK: + check_recipients = 0; + break; + + default: + return 1; + } + return 0; +} + +int +main (int argc, char **argv) +{ + int index; + char *name = "draft"; + + mu_init_nls (); + + mh_argp_parse (argc, argv, 0, options, mh_option, args_doc, doc, + opt_handler, NULL, &index); + + argc -= index; + argv += index; + + if (!use_draft && argc > 1) + name = argv[0]; + + if (!draft_folder) + draft_folder = mh_global_profile_get ("Draft-Folder", + mu_path_folder_dir); + return mh_whom (mh_expand_name (draft_folder, name, 0), check_recipients) ? + 1 : 0; +} |