/*
* aliasbr.c -- new aliasing mechanism
*
- * $Id$
- *
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
#include <h/mh.h>
#include <h/aliasbr.h>
+#include <h/addrsbr.h>
+#include <h/utils.h>
#include <grp.h>
#include <pwd.h>
/*
* prototypes
*/
-int alias (char *);
+int alias (char *);
int akvisible (void);
void init_pw (void);
char *akresult (struct aka *);
static char *akval (struct aka *, char *);
static int aleq (char *, char *);
-static char *scanp (char *);
+static char *scanp (unsigned char *);
static char *getp (char *);
static char *seekp (char *, char *, char **);
static int addfile (struct aka *, char *);
static void add_aka (struct aka *, char *);
static struct aka *akalloc (char *);
static struct home *hmalloc (struct passwd *);
-#ifndef MMDFMTS
struct home *seek_home (char *);
-#endif
/* Do mh alias substitution on 's' and return the results. */
if (!s)
return s; /* XXX */
- for (; ak; ak = ak->ak_next)
- if (aleq (s, ak->ak_name))
+ 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 getcpy (s);
}
static char *
-scanp (char *p)
+scanp (unsigned char *p)
{
while (isspace (*p))
p++;
static char *
getp (char *p)
{
- register char *cp = scanp (p);
+ register unsigned char *cp = scanp (p);
p = cp;
while (!isspace (*cp) && *cp)
static char *
seekp (char *p, char *c, char **a)
{
- register char *cp;
+ register unsigned char *cp;
p = cp = scanp (p);
while (!isspace (*cp) && *cp && *cp != ':' && *cp != ';')
return 0;
}
-#ifndef DBMPWD
- if (homehead == NULL)
- init_pw ();
-#endif /* DBMPWD */
-
while ((gp = *gr->gr_mem++))
-#ifdef DBMPWD
{
struct passwd *pw;
-#endif /* DBMPWD */
for (hm = homehead; hm; hm = hm->h_next)
if (!strcmp (hm->h_name, gp)) {
add_aka (ak, hm->h_name);
break;
}
-#ifdef DBMPWD
if ((pw = getpwnam(gp)))
{
hmalloc(pw);
add_aka (ak, gp);
}
}
-#endif /* DBMPWD */
return 1;
}
return 0;
}
-#ifndef DBMPWD
- if (homehead == NULL)
-#endif /* DBMPWD */
- init_pw ();
+ init_pw ();
for (hm = homehead; hm; hm = hm->h_next)
if (hm->h_gid == gid)
int noshell = NoShell == NULL || *NoShell == 0;
register struct home *hm;
-#ifndef DBMPWD
- if (homehead == NULL)
-#endif /* DBMPWD */
- init_pw ();
+ init_pw ();
+
if (Everyone < 0)
Everyone = EVERYONE;
for (hm = homehead; hm; hm = hm->h_next)
- if (hm->h_uid > Everyone
+ if ((int) hm->h_uid > Everyone
&& (noshell || strcmp (hm->h_shell, NoShell)))
add_aka (ak, hm->h_name);
static char *
getalias (char *addrs)
{
- register char *pp, *qp;
+ register unsigned char *pp, *qp;
static char *cp = NULL;
if (cp == NULL)
if (*cp == 0)
return (cp = NULL);
+ /* Remove leading any space from the address. */
for (pp = cp; isspace (*pp); pp++)
continue;
if (*pp == 0)
return (cp = NULL);
+ /* Find the end of the address. */
for (qp = pp; *qp != 0 && *qp != ','; qp++)
continue;
+ /* Set cp to point to the remainder of the addresses. */
if (*qp == ',')
*qp++ = 0;
for (cp = qp, qp--; qp > pp; qp--)
if (!strcmp (pp, ad->ad_text))
return;
- ad = (struct adr *) malloc (sizeof(*ad));
- if (ad == NULL)
- return;
+ ad = (struct adr *) mh_xmalloc (sizeof(*ad));
ad->ad_text = getcpy (pp);
ad->ad_local = strchr(pp, '@') == NULL && strchr(pp, '!') == NULL;
ad->ad_next = NULL;
init_pw (void)
{
register struct passwd *pw;
-#ifdef DBMPWD
static int init;
if (!init)
{
- /* if the list has yet to be initialized */
- /* zap the list, and rebuild from scratch */
- homehead=NULL;
- hometail=NULL;
- init++;
-#endif /* DBMPWD */
+ /* if the list has yet to be initialized */
+ /* zap the list, and rebuild from scratch */
+ homehead=NULL;
+ hometail=NULL;
+ init++;
- setpwent ();
+ setpwent ();
- while ((pw = getpwent ()))
- if (!hmalloc (pw))
- break;
+ while ((pw = getpwent ()))
+ if (!hmalloc (pw))
+ break;
- endpwent ();
-#ifdef DBMPWD
+ endpwent ();
}
-#endif /* DBMPWD */
}
{
register struct aka *p;
- if (!(p = (struct aka *) malloc (sizeof(*p))))
- return NULL;
+ p = (struct aka *) mh_xmalloc (sizeof(*p));
p->ak_name = getcpy (id);
p->ak_visible = 0;
{
register struct home *p;
- if (!(p = (struct home *) malloc (sizeof(*p))))
- return NULL;
+ p = (struct home *) mh_xmalloc (sizeof(*p));
p->h_name = getcpy (pw->pw_name);
p->h_uid = pw->pw_uid;
}
-#ifndef MMDFMTS
struct home *
seek_home (char *name)
{
register struct home *hp;
-#ifdef DBMPWD
struct passwd *pw;
char lname[32];
- char *c,*c1;
-#else /* DBMPWD */
-
- if (homehead == NULL)
- init_pw ();
-#endif /* DBMPWD */
+ unsigned char *c;
+ char *c1;
for (hp = homehead; hp; hp = hp->h_next)
- if (!strcasecmp (name, hp->h_name))
+ if (!mh_strcasecmp (name, hp->h_name))
return hp;
-#ifdef DBMPWD
/*
* The only place where there might be problems.
* This assumes that ALL usernames are kept in lowercase.
*/
- for (c = name, c1 = lname; *c && (c1 - lname < sizeof(lname) - 1); c++, c1++) {
+ for (c = name, c1 = lname;
+ *c && (c1 - lname < (int) sizeof(lname) - 1);
+ c++, c1++) {
if (isalpha(*c) && isupper(*c))
*c1 = tolower (*c);
else
*c1 = '\0';
if ((pw = getpwnam(lname)))
return(hmalloc(pw));
-#endif /* DBMPWD */
-
+
return NULL;
}
-#endif /* MMDFMTS */