Added warning to all nmh programs for multiple profile entries for the
[mmh] / sbr / readconfig.c
index 9cd128e..5900c37 100644 (file)
@@ -3,10 +3,13 @@
  * readconfig.c -- base routine to read nmh configuration files
  *              -- such as nmh profile, context file, or mhn.defaults.
  *
- * $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/utils.h>
 
 struct procstr {
     char *procname;
@@ -17,8 +20,8 @@ static struct procstr procs[] = {
     { "context",       &context },
     { "mh-sequences",  &mh_seq },
     { "buildmimeproc", &buildmimeproc },
-    { "faceproc",      &faceproc },
     { "fileproc",      &fileproc },
+    { "formatproc",    &formatproc },
     { "incproc",       &incproc },
     { "installproc",   &installproc },
     { "lproc",         &lproc },
@@ -28,7 +31,6 @@ static struct procstr procs[] = {
     { "mshproc",       &mshproc },
     { "packproc",      &packproc },
     { "postproc",      &postproc },
-    { "rmfproc",       &rmfproc },
     { "rmmproc",       &rmmproc },
     { "sendproc",      &sendproc },
     { "showmimeproc",  &showmimeproc },
@@ -61,8 +63,7 @@ readconfig (struct node **npp, FILE *ib, char *file, int ctx)
            case FLD:
            case FLDPLUS:
            case FLDEOF:
-               if (!(np = (struct node *) malloc (sizeof(*np))))
-                   adios (NULL, "unable to allocate profile storage");
+               np = (struct node *) mh_xmalloc (sizeof(*np));
                *npp = np;
                *(npp = &np->n_next) = NULL;
                np->n_name = getcpy (name);
@@ -105,5 +106,23 @@ readconfig (struct node **npp, FILE *ib, char *file, int ctx)
        break;
     }
 
+    if (opp == NULL) {
+       /* Check for duplicated profile entries.  But only on this
+          very first call from context_read(), when opp is NULL. */
+
+       for (np = m_defs; np; np = np->n_next) {
+           /* Yes, this is O(N^2).  The profile should be small enough so
+              that's not a performance problem. */
+           struct node *np2;
+           for (np2 = np->n_next; np2; np2 = np2->n_next) {
+               if (!mh_strcasecmp (np->n_name, np2->n_name)) {
+                   admonish (NULL, "multiple \"%s\" profile components "
+                               "in %s, ignoring \"%s\"",
+                             np->n_name, defpath, np2->n_field);
+               }
+           }
+       }
+    }
+
     opp = npp;
 }