summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2003-03-11 14:11:31 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2003-03-11 14:11:31 +0000
commit5c50702cdf6552db0098564009f3b49c3ce80df1 (patch)
tree4ee6cebcd2d63bcf8671c895ab1004a9f16b46ae
parentc36e5d80431856468390961d580d9f7ca2629fd4 (diff)
downloadmailutils-5c50702cdf6552db0098564009f3b49c3ce80df1.tar.gz
mailutils-5c50702cdf6552db0098564009f3b49c3ce80df1.tar.bz2
Added to the repository
-rw-r--r--mh/mh_whom.c184
-rw-r--r--mh/whom.c120
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;
+}

Return to:

Send suggestions and report system problems to the System administrator.