/*
* ali.c -- list nmh mail aliases
*
- * $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/addrsbr.h>
#include <h/aliasbr.h>
-
-/*
- * maximum number of names
- */
-#define NVEC 50
+#include <h/mts.h>
+#include <h/utils.h>
static struct swit switches[] = {
#define ALIASW 0
#define VERSIONSW 8
{ "version", 0 },
#define HELPSW 9
- { "help", 4 },
+ { "help", 0 },
{ NULL, 0 }
};
/*
* prototypes
*/
-void print_aka (char *, int, int);
-void print_usr (char *, int, int);
+static void print_aka (char *, int, int);
+static void print_usr (char *, int, int);
int
int i, vecp = 0, inverted = 0, list = 0;
int noalias = 0, normalize = AD_NHST;
char *cp, **ap, **argp, buf[BUFSIZ];
- char *vec[NVEC], **arguments;
+ /* Really only need to allocate for argc-1, but must allocate at least 1,
+ so go ahead and allocate for argc char pointers. */
+ char **vec = mh_xmalloc (argc * sizeof (char *)), **arguments;
struct aka *ak;
#ifdef LOCALE
snprintf (buf, sizeof(buf), "%s [switches] aliases ...",
invo_name);
print_help (buf, switches, 1);
- done (1);
+ done (0);
case VERSIONSW:
print_version (invo_name);
- done (1);
+ done (0);
case ALIASW:
if (!(cp = *argp++) || *cp == '-')
continue;
}
}
- vec[vecp++] = cp;
+
+ if (vecp < argc) {
+ vec[vecp++] = cp;
+ } else {
+ /* Should never happen, but try to protect against code changes
+ that could allow it. */
+ adios (NULL, "too many arguments");
+ }
}
if (!noalias) {
for (i = 0; i < vecp; i++)
print_usr (vec[i], list, normalize);
-
- done (0);
- }
-
- if (vecp) {
- /* print specified aliases */
- for (i = 0; i < vecp; i++)
- print_aka (akvalue (vec[i]), list, 0);
} else {
- /* print them all */
- for (ak = akahead; ak; ak = ak->ak_next) {
- printf ("%s: ", ak->ak_name);
- pos += strlen (ak->ak_name) + 1;
- print_aka (akresult (ak), list, pos);
+ if (vecp) {
+ /* print specified aliases */
+ for (i = 0; i < vecp; i++)
+ print_aka (akvalue (vec[i]), list, 0);
+ } else {
+ /* print them all */
+ for (ak = akahead; ak; ak = ak->ak_next) {
+ printf ("%s: ", ak->ak_name);
+ pos += strlen (ak->ak_name) + 1;
+ print_aka (akresult (ak), list, pos);
+ }
}
}
+ free (vec);
done (0);
+ return 1;
}
-void
+static void
print_aka (char *p, int list, int margin)
{
char c;
pos = 1;
}
-void
+static void
print_usr (char *s, int list, int norm)
{
register char *cp, *pp, *vp;
while ((cp = getname (pp))) {
if ((np = getm (cp, NULL, 0, norm, NULL)) == NULL)
continue;
- if (!strcasecmp (mp->m_host, np->m_host)
- && !strcasecmp (mp->m_mbox, np->m_mbox)) {
+ if (!mh_strcasecmp (mp->m_host, np->m_host)
+ && !mh_strcasecmp (mp->m_mbox, np->m_mbox)) {
vp = vp ? add (ak->ak_name, add (",", vp))
: getcpy (ak->ak_name);
mnfree (np);