X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/89b640fbfe885673d18b9232f2b8a60ce173a897..a2806483a53fcdb62ca8e2bec4f4e023355f4470:/sbr/mts.c?ds=sidebyside diff --git a/sbr/mts.c b/sbr/mts.c index 1bf62ce4..4a44c442 100644 --- a/sbr/mts.c +++ b/sbr/mts.c @@ -8,13 +8,10 @@ */ #include /* for snprintf() */ -#include #include #define nmhetcdir(file) NMHETCDIR#file -#include -#include #include #include #include @@ -23,7 +20,7 @@ /* * static prototypes */ -static char *tailor_value (unsigned char *); +static char *tailor_value (char *); static void getuserinfo (void); static const char *get_mtsconf_pathname(void); static const char *get_mtsuserconf_pathname(void); @@ -54,6 +51,8 @@ char *uucplfil = ""; char *mmdlm1 = "\001\001\001\001\n"; char *mmdlm2 = "\001\001\001\001\n"; +char *spoollocking = DEFAULT_LOCKING; + /* Cache the username, fullname, and mailbox of the user */ static char username[BUFSIZ]; static char fullname[BUFSIZ]; @@ -62,8 +61,8 @@ static char localmbox[BUFSIZ]; /* * MTS specific variables */ -static char *sm_method = "smtp"; -int sm_mts = MTS_SMTP; +static char *mts_method = "smtp"; +int sm_mts = MTS_SENDMAIL_SMTP; char *sendmail = SENDMAILPATH; /* @@ -102,11 +101,12 @@ static struct bind binds[] = { { "systemname", &systemname }, { "mmdfldir", &mmdfldir }, { "mmdflfil", &mmdflfil }, + { "spoollocking", &spoollocking }, { "uucpldir", &uucpldir }, { "uucplfil", &uucplfil }, { "mmdelim1", &mmdlm1 }, { "mmdelim2", &mmdlm2 }, - { "mts", &sm_method }, + { "mts", &mts_method }, { "sendmail", &sendmail }, { "clientname", &clientname }, { "servers", &servers }, @@ -119,6 +119,25 @@ static struct bind binds[] = { }; +/* Convert name of mts method to integer value and store it. */ +void +save_mts_method (const char *value) { + if (! strcasecmp (value, "smtp")) { + mts_method = "smtp"; + sm_mts = MTS_SMTP; + } else if (! strcasecmp (value, "sendmail/smtp") || + ! strcasecmp (value, "sendmail")) { + mts_method = "sendmail/smtp"; + sm_mts = MTS_SENDMAIL_SMTP; + } else if (! strcasecmp (value, "sendmail/pipe")) { + mts_method = "sendmail/pipe"; + sm_mts = MTS_SENDMAIL_PIPE; + } else { + adios (NULL, "unsupported mts selection \"%s\"", value); + } +} + + /* * Read the configuration file for the nmh interface * to the mail transport system (MTS). @@ -127,11 +146,10 @@ static struct bind binds[] = { void mts_init (char *name) { - NMH_UNUSED (name); - const char *cp; FILE *fp; static int inited = 0; + NMH_UNUSED (name); if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL) return; @@ -147,14 +165,7 @@ mts_init (char *name) Everyone = atoi (everyone); - if (strcmp(sm_method, "smtp") == 0) - sm_mts = MTS_SMTP; - else if (strcmp(sm_method, "sendmail") == 0) - sm_mts = MTS_SENDMAIL; - else { - advise(NULL, "unsupported \"mts\" value in mts.conf: %s", sm_method); - sm_mts = MTS_SMTP; - } + save_mts_method (mts_method); } @@ -166,7 +177,7 @@ mts_init (char *name) */ static char * -tailor_value (unsigned char *s) +tailor_value (char *s) { int i, r; char *bp; @@ -189,13 +200,13 @@ tailor_value (unsigned char *s) break; default: - if (!isdigit (*s)) { + if (!isdigit ((unsigned char) *s)) { *bp++ = QUOTE; *bp = *s; } - r = *s != '0' ? 10 : 8; - for (i = 0; isdigit (*s); s++) - i = i * r + *s - '0'; + r = ((unsigned char) *s) != '0' ? 10 : 8; + for (i = 0; isdigit ((unsigned char) *s); s++) + i = i * r + ((unsigned char) *s) - '0'; s--; *bp = toascii (i); break; @@ -338,19 +349,6 @@ getlocalmbox (void) if (username[0] == '\0') getuserinfo(); - if (localmbox[0] == '\0') { - char *cp; - - if ((cp = context_find("Local-Mailbox")) != NULL) { - strncpy(localmbox, cp, sizeof(localmbox)); - } else { - snprintf(localmbox, sizeof(localmbox), "%s <%s@%s>", fullname, - username, LocalName(0)); - } - - localmbox[sizeof(localmbox) - 1] = '\0'; - } - return localmbox; } @@ -361,9 +359,8 @@ getlocalmbox (void) static void getuserinfo (void) { - register unsigned char *cp; - register char *np; - register struct passwd *pw; + char *cp, *np; + struct passwd *pw; if ((pw = getpwuid (getuid ())) == NULL || pw->pw_name == NULL @@ -374,6 +371,39 @@ getuserinfo (void) return; } + + /* username */ + /* If there's a Local-Mailbox profile component, try to extract + the username from it. But don't try very hard, this assumes + the very simple User Name form. + Note that post(8) and whom(1) use context_foil (), so they + won't see the profile component. */ + if ((np = context_find("Local-Mailbox")) != NULL) { + char *left_angle_bracket = strchr (np, '<'); + char *at_sign = strchr (np, '@'); + char *right_angle_bracket = strchr (np, '>'); + + strncpy(localmbox, np, sizeof(localmbox)); + + if (left_angle_bracket && at_sign && right_angle_bracket) { + if (at_sign > left_angle_bracket && + at_sign - left_angle_bracket < BUFSIZ) { + strncpy(username, left_angle_bracket + 1, + at_sign - left_angle_bracket - 1); + } + } + } + + if (username[0] == '\0') { + strncpy (username, pw->pw_name, sizeof(username)); + } + + username[sizeof(username) - 1] = '\0'; + + escape_local_part(username, sizeof(username)); + + + /* fullname */ np = pw->pw_gecos; /* Get the user's real name from the GECOS field. Stop once we hit a ',', @@ -383,11 +413,11 @@ getuserinfo (void) continue; *cp = '\0'; - strncpy (username, pw->pw_name, sizeof(username)); - /* 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. */ + setting if it exists. + Note that post(8) and whom(1) use context_foil (), so they + won't see the profile component. */ if ((cp = getenv ("SIGNATURE")) && *cp) strncpy (fullname, cp, sizeof(fullname)); else if ((cp = context_find("Signature"))) @@ -397,9 +427,14 @@ getuserinfo (void) escape_display_name(fullname, sizeof(fullname)); - localmbox[0] = '\0'; - return; + /* localmbox, if not using Local-Mailbox */ + if (localmbox[0] == '\0') { + snprintf(localmbox, sizeof(localmbox), "%s <%s@%s>", fullname, + username, LocalName(0)); + } + + localmbox[sizeof(localmbox) - 1] = '\0'; } static const char* @@ -425,8 +460,7 @@ get_mtsuserconf_pathname (void) static void mts_read_conf_file (FILE *fp) { - unsigned char *bp; - char *cp, buffer[BUFSIZ]; + char *bp, *cp, buffer[BUFSIZ]; struct bind *b; while (fgets (buffer, sizeof(buffer), fp)) { @@ -438,7 +472,7 @@ mts_read_conf_file (FILE *fp) if (!(bp = strchr(buffer, ':'))) break; *bp++ = 0; - while (isspace (*bp)) + while (isspace ((unsigned char) *bp)) *bp++ = 0; for (b = binds; b->keyword; b++)