X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/476a6ffe0e92478020f4a1c320a4076acc2f58c9..418ee17e8bd250785855ca3f3f1ff0e19331d498:/sbr/mts.c diff --git a/sbr/mts.c b/sbr/mts.c index a8c8b892..5f4e3676 100644 --- a/sbr/mts.c +++ b/sbr/mts.c @@ -21,10 +21,10 @@ /* * 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; } @@ -398,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 && @@ -419,26 +430,17 @@ getuserinfo (void) escape_local_part(mboxname, sizeof(mboxname)); } -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) {