Added -mts switch to post, send, and whom. Replaced test-sendmail-pipe
[mmh] / sbr / mts.c
index b529d15..bf7d42b 100644 (file)
--- a/sbr/mts.c
+++ b/sbr/mts.c
@@ -62,9 +62,8 @@ static char localmbox[BUFSIZ];
 /*
  * MTS specific variables
  */
-static char *sm_method = "smtp";
-int  sm_mts    = MTS_SMTP;
-char *hostable = nmhetcdir(/hosts);
+static char *mts_method = "smtp";
+int  sm_mts    = MTS_SENDMAIL_SMTP;
 char *sendmail = SENDMAILPATH;
 
 /*
@@ -107,8 +106,7 @@ static struct bind binds[] = {
     { "uucplfil", &uucplfil },
     { "mmdelim1", &mmdlm1 },
     { "mmdelim2", &mmdlm2 },
-    { "mts",      &sm_method },
-    { "hostable", &hostable  },
+    { "mts",      &mts_method },
     { "sendmail", &sendmail  },
     { "clientname",  &clientname },
     { "servers", &servers },
@@ -121,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 (! mh_strcasecmp (value, "smtp")) {
+        mts_method = "smtp";
+        sm_mts = MTS_SMTP;
+    } else if (! mh_strcasecmp (value, "sendmail/smtp")  ||
+               ! mh_strcasecmp (value, "sendmail")) {
+        mts_method = "sendmail/smtp";
+        sm_mts = MTS_SENDMAIL_SMTP;
+    } else if (! mh_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).
@@ -129,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;
@@ -149,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);
 }
 
 
@@ -340,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;
 }
 
@@ -376,6 +372,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 <user@name.com> 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 ',',
@@ -385,11 +414,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")))
@@ -399,9 +428,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*