SMTPMTS has been the default for over a decade, so it's time to get rid of
[mmh] / sbr / mts.c
index 834579d..ba7ff07 100644 (file)
--- a/sbr/mts.c
+++ b/sbr/mts.c
@@ -54,9 +54,10 @@ char *uucplfil = "";
 char *mmdlm1 = "\001\001\001\001\n";
 char *mmdlm2 = "\001\001\001\001\n";
 
-/* Cache the username and fullname of the user */
+/* Cache the username, fullname, and mailbox of the user */
 static char username[BUFSIZ];
 static char fullname[BUFSIZ];
+static char localmbox[BUFSIZ];
 
 /* Variables for username masquerading: */
        boolean  draft_from_masquerading = FALSE;  /* also used from post.c */
@@ -67,18 +68,16 @@ static char*    masquerade = "";
 /*
  * MTS specific variables
  */
-#if defined(SMTPMTS)
 static char *sm_method = "smtp";
 int  sm_mts    = MTS_SMTP;
 char *hostable = nmhetcdir(/hosts);
 char *sendmail = SENDMAILPATH;
-#endif
 
 /*
  * SMTP/POP stuff
  */
 char *clientname = NULL;
-char *servers    = "localhost \01localnet";
+char *servers    = "localhost";
 char *pophost    = "";
 
 /*
@@ -115,13 +114,9 @@ static struct bind binds[] = {
     { "mmdelim1", &mmdlm1 },
     { "mmdelim2", &mmdlm2 },
     { "masquerade", &masquerade },
-
-#if defined(SMTPMTS)
     { "mts",      &sm_method },
     { "hostable", &hostable  },
     { "sendmail", &sendmail  },
-#endif
-
     { "clientname",  &clientname },
     { "servers", &servers },
     { "pophost", &pophost },
@@ -170,7 +165,6 @@ mts_init (char *name)
     if (strstr(masquerade, "username_extension") != NULL)
        username_extension_masquerading = TRUE;
 
-#ifdef SMTPMTS
     if (strcmp(sm_method, "smtp") == 0)
         sm_mts = MTS_SMTP;
     else if (strcmp(sm_method, "sendmail") == 0)
@@ -179,7 +173,6 @@ mts_init (char *name)
         advise(NULL, "unsupported \"mts\" value in mts.conf: %s", sm_method);
         sm_mts = MTS_SMTP;
     }
-#endif
 }
 
 
@@ -238,34 +231,45 @@ tailor_value (unsigned char *s)
 
 /*
  * Get the fully qualified name of the local host.
+ *
+ * If flag is 0, then use anything out of mts.conf (like localname).
+ * If flag is 1, then only use the "proper" local hostname.
  */
 
 char *
-LocalName (void)
+LocalName (int flag)
 {
-    static char buffer[BUFSIZ] = "";
+    static char buffer0[BUFSIZ] = "";
+    static char buffer1[BUFSIZ] = "";
+    static char *buffer[] = { buffer0, buffer1 };
+    char *buf;
     struct addrinfo hints, *res;
 
+    if (flag < 0 || flag > 1)
+       return NULL;
+
+    buf = buffer[flag];
+
     /* check if we have cached the local name */
-    if (buffer[0])
-       return buffer;
+    if (buf[0])
+       return buf;
 
     mts_init ("mts");
 
     /* check if the mts.conf file specifies a "localname" */
-    if (*localname) {
-       strncpy (buffer, localname, sizeof(buffer));
+    if (*localname && flag == 0) {
+       strncpy (buf, localname, sizeof(buffer0));
     } else {
-       memset(buffer, 0, sizeof(buffer));
+       memset(buf, 0, sizeof(buffer0));
        /* first get our local name */
-       gethostname (buffer, sizeof(buffer) - 1);
+       gethostname (buf, sizeof(buffer0) - 1);
        /* now fully qualify our name */
 
        memset(&hints, 0, sizeof(hints));
        hints.ai_flags = AI_CANONNAME;
        hints.ai_family = PF_UNSPEC;
-       if (getaddrinfo(buffer, NULL, &hints, &res) == 0) {
-           strncpy(buffer, res->ai_canonname, sizeof(buffer) - 1);
+       if (getaddrinfo(buf, NULL, &hints, &res) == 0) {
+           strncpy(buf, res->ai_canonname, sizeof(buffer0) - 1);
            freeaddrinfo(res);
        }
     }
@@ -275,11 +279,11 @@ LocalName (void)
      * we append that now.  This should rarely be needed.
      */
     if (*localdomain) {
-       strcat (buffer, ".");
-       strcat (buffer, localdomain);
+       strcat (buf, ".");
+       strcat (buf, localdomain);
     }
 
-    return buffer;
+    return buf;
 }
 
 
@@ -341,6 +345,34 @@ getfullname (void)
 
 
 /*
+ * Get the full local mailbox name.  This is in the form:
+ *
+ * User Name <user@name.com>
+ */
+
+char *
+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;
+}
+
+/*
  * Find the user's username and full name, and cache them.
  * Also, handle "mmailid" username masquerading controlled from the GECOS field
  * of the passwd file. 
@@ -401,9 +433,12 @@ getuserinfo (void)
        strncpy (username, pw->pw_name, sizeof(username));
 
     /* The $SIGNATURE environment variable overrides the GECOS field's idea of
-       your real name. */
+       your real name. If SIGNATURE isn't set, use the Signature profile
+       setting if it exists. */
     if ((cp = getenv ("SIGNATURE")) && *cp)
        strncpy (fullname, cp, sizeof(fullname));
+    else if ((cp = context_find("Signature")))
+       strncpy (fullname, cp, sizeof(fullname));
 
     if (strchr(fullname, '.')) {               /*  quote any .'s */
        char tmp[BUFSIZ];
@@ -413,13 +448,17 @@ getuserinfo (void)
        strncpy (fullname, tmp, sizeof(fullname));
     }
 
+    fullname[sizeof(fullname) - 1] = '\0';
+
+    localmbox[0] = '\0';
+
     return;
 }
 
 static const char*
 get_mtsconf_pathname (void)
 {
-    const char *cp = getenv ( "MHMTSCONF ");
+    const char *cp = getenv ( "MHMTSCONF" );
     if (cp != NULL && *cp != '\0') {
         return cp;
     }