]> diplodocus.org Git - nmh/blobdiff - sbr/mts.c
Added many flags to CFLAGS with gcc, if supported.
[nmh] / sbr / mts.c
index b7e6571aec18b89e5c541ae852cc36744b527be2..5f4e3676daa16d85198502af87872aff8e029919 100644 (file)
--- a/sbr/mts.c
+++ b/sbr/mts.c
 /*
  * static prototypes
  */
+static void read_mts(const char *path);
 static char *tailor_value (char *);
 static void getuserinfo (void);
-static const char *get_mtsconf_pathname(void);
-static const char *get_mtsuserconf_pathname(void);
+static const char *get_optional_env_var(const char *name, const char *fallback);
 static void mts_read_conf_file (FILE *fp);
 
 /*
@@ -38,8 +38,6 @@ static void mts_read_conf_file (FILE *fp);
 /*
  * nmh mail transport interface customization file
  */
-static char *mtsconf = nmhetcdir(/mts.conf);
-
 static char *localname   = "";
 static char *localdomain = "";
 static char *systemname  = "";
@@ -137,26 +135,39 @@ save_mts_method (const char *value)
 void
 mts_init (void)
 {
-    const char *cp;
-    FILE *fp;
-    static int inited = 0;
+    static bool deja_vu;
+    const char *path;
 
-    if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL)
-       return;
-    mts_read_conf_file(fp);
-    fclose (fp);
+    if (deja_vu)
+        return;
+    deja_vu = true;
 
-    cp = get_mtsuserconf_pathname();
-    if (cp != NULL &&
-            ((fp = fopen (get_mtsuserconf_pathname(), "r")) != NULL)) {
-        mts_read_conf_file(fp);
-        fclose (fp);
-    }
+    path = get_optional_env_var("MHMTSCONF", NMHETCDIR "/mts.conf");
+    read_mts(path);
+
+    path = get_optional_env_var("MHMTSUSERCONF", NULL);
+    if (path)
+        read_mts(path);
 
     save_mts_method (mts_method);
 }
 
 
+static void read_mts(const char *path)
+{
+    FILE *fp;
+
+    fp = fopen(path, "r");
+    if (!fp)
+        adios(path, "error opening mts.conf:");
+    mts_read_conf_file(fp);
+    if (ferror(fp))
+        adios(path, "error reading mts.conf:");
+    if (fclose(fp))
+        adios(path, "error closing mts.conf:");
+}
+
+
 #define        QUOTE   '\\'
 
 /*
@@ -235,7 +246,7 @@ LocalName (int flag)
 
     /* check if the mts.conf file specifies a "localname" */
     if (*localname && flag == 0) {
-       strncpy (buf, localname, sizeof(buffer0));
+       strncpy (buf, localname, sizeof(buffer0) - 1);
     } else {
        memset(buf, 0, sizeof(buffer0));
        /* first get our local name */
@@ -282,7 +293,7 @@ SystemName (void)
 
     /* check if mts.conf file specifies a "systemname" */
     if (*systemname) {
-       strncpy (buffer, systemname, sizeof(buffer));
+       strncpy (buffer, systemname, sizeof(buffer) - 1);
        return buffer;
     }
 
@@ -365,6 +376,28 @@ getuserinfo (void)
     }
     username[sizeof(username) - 1] = '\0';
 
+    /* fullname */
+    np = pw->pw_gecos;
+
+    /* Get the user's real name from the GECOS field.  Stop once we hit a ',',
+       which some OSes use to separate other 'finger' information in the GECOS
+       field, like phone number. */
+    for (cp = fullname; *np != '\0' && *np != ','; *cp++ = *np++)
+       continue;
+    *cp = '\0';
+
+    /* The $SIGNATURE environment variable overrides the GECOS field's idea of
+       your real name. If SIGNATURE isn't set, use the Signature profile
+       setting if it exists.
+       Note that post(8) uses context_foil(), so it won't see the profile
+       component. */
+    if ((cp = getenv ("SIGNATURE")) && *cp)
+       strncpy (fullname, cp, sizeof(fullname));
+    else if ((cp = context_find("Signature")))
+       strncpy (fullname, cp, sizeof(fullname));
+    fullname[sizeof(fullname) - 1] = '\0';
+    escape_display_name(fullname, sizeof(fullname));
+
     /* localmbox and mboxname */
     /* If there's a Local-Mailbox profile component, try to extract
        the username from it.  But don't try very hard, this assumes
@@ -376,7 +409,7 @@ getuserinfo (void)
        char *at_sign = strchr (np, '@');
        char *right_angle_bracket = strchr (np, '>');
 
-       strncpy(localmbox, np, sizeof(localmbox));
+       strncpy(localmbox, np, sizeof(localmbox) - 1);
 
        if (left_angle_bracket  &&  at_sign  &&  right_angle_bracket) {
            if (at_sign > left_angle_bracket  &&
@@ -395,50 +428,19 @@ getuserinfo (void)
     }
     mboxname[sizeof(mboxname) - 1] = '\0';
     escape_local_part(mboxname, sizeof(mboxname));
-
-    /* fullname */
-    np = pw->pw_gecos;
-
-    /* Get the user's real name from the GECOS field.  Stop once we hit a ',',
-       which some OSes use to separate other 'finger' information in the GECOS
-       field, like phone number. */
-    for (cp = fullname; *np != '\0' && *np != ','; *cp++ = *np++)
-       continue;
-    *cp = '\0';
-
-    /* The $SIGNATURE environment variable overrides the GECOS field's idea of
-       your real name. If SIGNATURE isn't set, use the Signature profile
-       setting if it exists.
-       Note that post(8) uses context_foil(), so it won't see the profile
-       component. */
-    if ((cp = getenv ("SIGNATURE")) && *cp)
-       strncpy (fullname, cp, sizeof(fullname));
-    else if ((cp = context_find("Signature")))
-       strncpy (fullname, cp, sizeof(fullname));
-    fullname[sizeof(fullname) - 1] = '\0';
-    escape_display_name(fullname, sizeof(fullname));
 }
 
-static const char*
-get_mtsconf_pathname (void)
-{
-    const char *cp = getenv ( "MHMTSCONF" );
-    if (cp != NULL && *cp != '\0') {
-        return cp;
-    }
-    return mtsconf;
-}
 
-static const char*
-get_mtsuserconf_pathname (void)
+static const char *
+get_optional_env_var(const char *name, const char *fallback)
 {
-    const char *cp = getenv ( "MHMTSUSERCONF" );
-    if (cp != NULL && *cp != '\0') {
-        return cp;
-    }
-    return NULL;
+    const char *v = getenv(name);
+    if (v)
+        return v;
+    return fallback;
 }
 
+
 static void
 mts_read_conf_file (FILE *fp)
 {