diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-29 15:13:02 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-29 15:13:02 +0300 |
commit | 56009435e6c30702fac15c75df9b4c43f50e8bf5 (patch) | |
tree | e0adbb2245c767d6eba8dffbcef4ed8595477ae1 /mh | |
parent | 7fd25e1edf24dc4ba173b5d05021fd0dbcc2f07c (diff) | |
download | mailutils-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.
Diffstat (limited to 'mh')
-rw-r--r-- | mh/etc/replcomps | 2 | ||||
-rw-r--r-- | mh/etc/replgroupcomps | 2 | ||||
-rw-r--r-- | mh/mh.h | 6 | ||||
-rw-r--r-- | mh/mh_format.c | 60 | ||||
-rw-r--r-- | mh/mh_init.c | 68 | ||||
-rw-r--r-- | mh/repl.c | 5 |
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%>%>\ @@ -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 @@ -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; } |