.nf
<%etcdir%/MoreAliases
sgroup: fred, fear, freida
-b-people: Blind List: bill, betty;
+b-people: Blind List: bill, betty
fred: frated@UCI
UNIX\-committee: <unix.aliases
staff: =staff
.RI ` aliases '
file as appropriate.
.RE
+.PP
+Earlier versions of this man page showed a semicolon at the end of the
+blind list example. That caused the preceeding alias to not be
+expanded. There must not be a semicolon at the end of, or within, the
+address group of a blind list.
+.B post
+will append the semicolon to the blind list name.
.SH FILES
None
Since the number of file descriptors is finite (and very limited), such
infinite recursion will terminate with a meaningless diagnostic when
all the fds are used up.
-.PP
-Forward references do not work correctly inside blind lists.
#include <h/mh.h>
#include <h/aliasbr.h>
+#include <h/addrsbr.h>
#include <h/utils.h>
#include <grp.h>
#include <pwd.h>
if (!s)
return s; /* XXX */
- for (; ak; ak = ak->ak_next)
- if (aleq(s, ak->ak_name))
- return akresult(ak);
+ for (; ak; ak = ak->ak_next) {
+ if (aleq (s, ak->ak_name)) {
+ return akresult (ak);
+ } else if (strchr (s, ':')) {
+ /*
+ ** The first address in a blind list will contain the
+ ** alias name, so try to match, but just with just the
+ ** address (not including the list name). If there's a
+ ** match, then replace the alias part with its
+ ** expansion.
+ */
+
+ char *name = getname(s);
+ char *cp = NULL;
+
+ if (name) {
+ /*
+ ** s is of the form "Blind list: address". If address
+ ** is an alias, expand it.
+ */
+ struct mailname *mp = getm(name, NULL, 0, AD_NAME, NULL);
+
+ if (mp && mp->m_ingrp) {
+ char *gname = add (mp->m_gname, NULL);
+
+ if (gname && aleq(name, ak->ak_name)) {
+ /* Will leak cp. */
+ cp = concat (gname, akresult (ak), NULL);
+ free(gname);
+ }
+ }
+ mnfree(mp);
+ }
+ /* Need to flush getname after use. */
+ while (getname("")) continue;
+
+ if (cp) {
+ return cp;
+ }
+ }
+ }
return mh_xstrdup(s);
}