summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-07-29 15:13:02 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-07-29 15:13:02 +0300
commit56009435e6c30702fac15c75df9b4c43f50e8bf5 (patch)
treee0adbb2245c767d6eba8dffbcef4ed8595477ae1
parent7fd25e1edf24dc4ba173b5d05021fd0dbcc2f07c (diff)
downloadmailutils-56009435e6c30702fac15c75df9b4c43f50e8bf5.tar.gz
mailutils-56009435e6c30702fac15c75df9b4c43f50e8bf5.tar.bz2
Implement new MH format primitives (for compatibility with nmh).
* mh/etc/replcomps: Use localmbox instead of me. * mh/etc/replgroupcomps: Likewise. * mh/mh.h (mh_get_my_real_name) (mh_get_my_user_name,mh_my_host): New protos. (mh_my_email): Change prototype. * mh/mh_format.c (builtin_me): Use mh_get_my_user_name. (builtin_myhost,builtin_myname,builtin_localmbox): New functions. (builtin_formataddr): Preserve collected data if the address is not parseable. (builtin_tab): New functions: myhost, myname, localmbox. * mh/mh_init.c (mh_local_mailbox): New function. (mh_get_my_real_name) (mh_get_my_user_name,mh_my_host): New functions. * mh/repl.c (set_group): Don't overwrite any prior -form or -format options.
-rw-r--r--mh/etc/replcomps2
-rw-r--r--mh/etc/replgroupcomps2
-rw-r--r--mh/mh.h6
-rw-r--r--mh/mh_format.c60
-rw-r--r--mh/mh_init.c68
-rw-r--r--mh/repl.c5
6 files changed, 89 insertions, 54 deletions
diff --git a/mh/etc/replcomps b/mh/etc/replcomps
index 63fddf9eb..6a3df65ce 100644
--- a/mh/etc/replcomps
+++ b/mh/etc/replcomps
@@ -7,7 +7,7 @@
%;
%(lit)%(formataddr %<{reply-to}%?{from}%?{sender}%?{return-path}%>)\
%<(nonnull)%(void(width))%(putaddr To: )\n%>\
-%(lit)%<(rcpt to)%(formataddr{to})%>%<(rcpt cc)%(formataddr{cc})%>%<(rcpt me)%(formataddr(me))%>\
+%(lit)%<(rcpt to)%(formataddr{to})%>%<(rcpt cc)%(formataddr{cc})%>%<(rcpt me)%(formataddr(localmbox))%>\
%<(nonnull)%(void(width))%(putaddr cc: )\n%>\
%<(mymbox{from})%<{fcc}Fcc: %{fcc}\n%>%>\
Subject: %<{subject}%(putstr %<(profile reply-prefix)%|\
diff --git a/mh/etc/replgroupcomps b/mh/etc/replgroupcomps
index e9aa305d3..91a7a7b72 100644
--- a/mh/etc/replgroupcomps
+++ b/mh/etc/replgroupcomps
@@ -10,7 +10,7 @@
%|\
%(lit)%(formataddr %<{mail-reply-to}%?{reply-to}%?{from}%?{sender}%?{return-path}%>)\
%<(nonnull)%(void(width))%(putaddr To: )\n%>\
-%(lit)%<(rcpt to)%(formataddr{to})%>%<(rcpt cc)%(formataddr{cc})%>%<(rcpt me)%(formataddr(me))%>\
+%(lit)%<(rcpt to)%(formataddr{to})%>%<(rcpt cc)%(formataddr{cc})%>%<(rcpt me)%(formataddr(localmbox))%>\
%<(nonnull)%(void(width))%(putaddr cc: )\n%>%>\
%;
%<(mymbox{from})%<{fcc}Fcc: %{fcc}\n%>%>\
diff --git a/mh/mh.h b/mh/mh.h
index 400affac8..27e8a24af 100644
--- a/mh/mh.h
+++ b/mh/mh.h
@@ -231,7 +231,11 @@ void mh_expand_aliases (mu_message_t msg, mu_address_t *addr_to,
mu_address_t *addr_bcc);
int mh_is_my_name (const char *name);
-char * mh_my_email (void);
+char const *mh_get_my_real_name (void);
+char const *mh_get_my_user_name (void);
+char const *mh_my_email (void);
+char const *mh_my_host (void);
+
size_t mh_get_message (mu_mailbox_t mbox, size_t seqno, mu_message_t *mesg);
diff --git a/mh/mh_format.c b/mh/mh_format.c
index 9a4b07fc7..a3ec40570 100644
--- a/mh/mh_format.c
+++ b/mh/mh_format.c
@@ -786,10 +786,25 @@ builtin_timenow (struct mh_fvm *mach)
static void
builtin_me (struct mh_fvm *mach)
{
- char *s;
- mu_asprintf (&s, "<%s>", mh_my_email ());
- mh_string_load (&mach->str[R_REG], s);
- free (s);
+ mh_string_load (&mach->str[R_REG], mh_get_my_user_name ());
+}
+
+static void
+builtin_myhost (struct mh_fvm *mach)
+{
+ mh_string_load (&mach->str[R_REG], mh_my_host ());
+}
+
+static void
+builtin_myname (struct mh_fvm *mach)
+{
+ mh_string_load (&mach->str[R_REG], mh_get_my_real_name ());
+}
+
+static void
+builtin_localmbox (struct mh_fvm *mach)
+{
+ mh_string_load (&mach->str[R_REG], mh_my_email ());
}
static void
@@ -1579,33 +1594,31 @@ builtin_formataddr (struct mh_fvm *mach)
dest = NULL;
else if (mu_address_create (&dest, mh_string_value (&mach->str[R_ACC])))
return;
-
- if (mu_address_create (&addr, mh_string_value (&mach->str[R_ARG])))
- {
- mu_address_destroy (&dest);
- return;
- }
- mu_address_get_count (addr, &num);
- for (i = 1; i <= num; i++)
+ if (!mh_string_is_null (&mach->str[R_ARG])
+ && mu_address_create (&addr, mh_string_value (&mach->str[R_ARG])) == 0)
{
- if (mu_address_sget_email (addr, i, &buf) == 0)
+ mu_address_get_count (addr, &num);
+ for (i = 1; i <= num; i++)
{
- if ((rcpt_mask & RCPT_ME) || !mh_is_my_name (buf))
+ if (mu_address_sget_email (addr, i, &buf) == 0)
{
- mu_address_t subaddr;
- mu_address_get_nth (addr, i, &subaddr);
- if (!addrlist_lookup (mach->addrlist, subaddr))
+ if ((rcpt_mask & RCPT_ME) || !mh_is_my_name (buf))
{
- mu_list_append (mach->addrlist, subaddr);
- mu_address_union (&dest, subaddr);
+ mu_address_t subaddr;
+ mu_address_get_nth (addr, i, &subaddr);
+ if (!addrlist_lookup (mach->addrlist, subaddr))
+ {
+ mu_list_append (mach->addrlist, subaddr);
+ mu_address_union (&dest, subaddr);
+ }
+ else
+ mu_address_destroy (&subaddr);
}
- else
- mu_address_destroy (&subaddr);
}
}
}
-
+
if (mu_address_sget_printable (dest, &buf) == 0)
mh_string_load (&mach->str[R_REG], buf);
else
@@ -1799,6 +1812,9 @@ mh_builtin_t builtin_tab[] = {
{ "charleft", builtin_charleft, mhtype_num, mhtype_none },
{ "timenow", builtin_timenow, mhtype_num, mhtype_none },
{ "me", builtin_me, mhtype_str, mhtype_none },
+ { "myhost", builtin_myhost, mhtype_str, mhtype_none },
+ { "myname", builtin_myname, mhtype_str, mhtype_none },
+ { "localmbox",builtin_localmbox,mhtype_str, mhtype_none },
{ "eq", builtin_eq, mhtype_num, mhtype_num, MHA_LITERAL },
{ "ne", builtin_ne, mhtype_num, mhtype_num, MHA_LITERAL },
{ "gt", builtin_gt, mhtype_num, mhtype_num, MHA_LITERAL },
diff --git a/mh/mh_init.c b/mh/mh_init.c
index 3cc3625d5..1a8ec26ed 100644
--- a/mh/mh_init.c
+++ b/mh/mh_init.c
@@ -57,39 +57,55 @@ mh_err_memory (int fatal)
abort ();
}
-static char *my_name;
-static char *my_email;
-
-static char *
-mh_get_my_name (void)
+static mu_address_t
+mh_local_mailbox (void)
{
- if (!my_name)
+ static mu_address_t local_mailbox;
+ if (!local_mailbox)
{
- struct passwd *pw = getpwuid (getuid ());
- if (!pw)
- {
- mu_error (_("cannot determine my username"));
- my_name = mu_strdup ("unknown");
- }
- else
- my_name = mu_strdup (pw->pw_name);
+ const char *p = mh_global_profile_get ("Local-Mailbox", NULL);
+ if (!p)
+ p = mu_get_user_email (NULL);
+ mu_address_create (&local_mailbox, p);
}
- return my_name;
+ return local_mailbox;
}
-char *
+char const *
+mh_get_my_user_name (void)
+{
+ mu_address_t addr = mh_local_mailbox ();
+ char const *s;
+ MU_ASSERT (mu_address_sget_local_part (addr, 1, &s));
+ return s;
+}
+
+char const *
+mh_get_my_real_name (void)
+{
+ mu_address_t addr = mh_local_mailbox ();
+ char const *s;
+ if (mu_address_sget_personal (addr, 1, &s))
+ return NULL;
+ return s;
+}
+
+char const *
mh_my_email (void)
{
- char *username = mh_get_my_name ();
- if (!my_email)
- {
- const char *p = mh_global_profile_get ("Local-Mailbox", NULL);
- if (p)
- my_email = mu_strdup (p);
- else
- my_email = mu_get_user_email (username);
- }
- return my_email;
+ mu_address_t addr = mh_local_mailbox ();
+ char const *s;
+ MU_ASSERT (mu_address_sget_printable (addr, &s));
+ return s;
+}
+
+char const *
+mh_my_host (void)
+{
+ mu_address_t addr = mh_local_mailbox ();
+ char const *s;
+ MU_ASSERT (mu_address_sget_domain (addr, 1, &s));
+ return s;
}
enum part_match_mode
diff --git a/mh/repl.c b/mh/repl.c
index a39ec7094..7c287bb53 100644
--- a/mh/repl.c
+++ b/mh/repl.c
@@ -91,11 +91,10 @@ set_whatnowproc (struct mu_parseopt *po, struct mu_option *opt,
static void
set_group (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
{
- mh_format_destroy (&format);
if (strcmp (arg, "1") == 0)
{
- if (mh_format_file_parse (&format, "replgroupcomps",
- MH_FMT_PARSE_DEFAULT))
+ if (!format && mh_format_file_parse (&format, "replgroupcomps",
+ MH_FMT_PARSE_DEFAULT))
exit (1);
rcpt_mask |= RCPT_ALL;
}

Return to:

Send suggestions and report system problems to the System administrator.