X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/ddf3a8574f657dcb8c53fc5908e7bebbde1994b5..418ee17e8bd250785855ca3f3f1ff0e19331d498:/sbr/mts.c?ds=inline diff --git a/sbr/mts.c b/sbr/mts.c index b7e6571a..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; } @@ -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) {