#include <h/mh.h>
#include <h/addrsbr.h>
#include <h/mf.h>
+#include <h/mts.h>
/* High level parsing of addresses:
static char adr[BUFSIZ];
-extern boolean username_extension_masquerading; /* defined in mts.c */
-
-
-/*
- * external prototypes
- */
-char *getusername (void);
-
-
char *
getname (char *addrs)
{
}
if (dfhost == NULL) {
- dfhost = LocalName ();
+ dfhost = LocalName (0);
dftype = LOCALHOST;
}
}
if (wanthost == AD_NHST)
- mp->m_type = !mh_strcasecmp (LocalName (), mp->m_host)
+ mp->m_type = !mh_strcasecmp (LocalName (0), mp->m_host)
? LOCALHOST : NETHOST;
else
- mp->m_type = mh_strcasecmp (LocalName(), mp->m_host) ? NETHOST : LOCALHOST;
+ mp->m_type = mh_strcasecmp (LocalName(0), mp->m_host) ? NETHOST : LOCALHOST;
got_host: ;
if (route)
/*
- * address specific "sprintf"
+ * This used to be adrsprintf() (where it would format an address for you
+ * given a username and a domain). But somewhere we got to the point where
+ * the only caller was post, and it only called it with both arguments NULL.
+ * So the function was renamed with a more sensible name.
*/
char *
-adrsprintf (char *username, char *domain)
+getlocaladdr(void)
{
- int snprintf_return;
- static char addr[BUFSIZ];
-
- if (username == NULL)
- username = getusername();
-
- if (username_extension_masquerading) {
- /* mts.conf contains "masquerade:[...]username_extension[...]", so tack
- on the value of the $USERNAME_EXTENSION environment variable, if set,
- to username. */
- char* extension = getenv("USERNAME_EXTENSION");
- static char username_with_extension[BUFSIZ];
-
- if (extension != NULL && *extension != '\0') {
- snprintf_return = snprintf(username_with_extension,
- sizeof(username_with_extension),
- "%s%s", username, extension);
-
- if (snprintf_return < 0 ||
- snprintf_return >= sizeof(username_with_extension))
- adios(NULL, "snprintf() error writing username (%d chars) and"
- " $USERNAME_EXTENSION (%d chars) to array of BUFSIZ (%d)"
- " chars",
- strlen(username), strlen(extension), BUFSIZ);
-
- username = username_with_extension;
- }
- }
+ char *username;
- return username;
-
- if (domain == NULL)
- domain = LocalName();
+ username = getusername();
- snprintf_return = snprintf (addr, sizeof(addr), "%s@%s", username, domain);
-
- if (snprintf_return < 0 || snprintf_return >= sizeof(addr))
- adios(NULL, "snprintf() error writing username (%d chars), domain (%d"
- " chars), and 1 separator char to array of BUFSIZ (%d) chars",
- strlen(username), strlen(domain), BUFSIZ);
-
- return addr;
+ return username;
}
char buffer[BUFSIZ];
struct mailname *mp;
static char *am = NULL;
- static struct mailname mq={NULL};
+ static struct mailname mq;
+ static int localmailbox = 0;
/*
* If this is the first call, initialize
if (am == NULL) {
mq.m_next = NULL;
mq.m_mbox = getusername ();
+
+ if ((am = context_find ("local-mailbox"))) {
+
+ localmailbox++;
+
+ if ((cp = getname(am)) == NULL) {
+ admonish (NULL, "Unable to find address in local-mailbox");
+ return 0;
+ }
+
+ if ((mq.m_next = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) {
+ admonish (NULL, "invalid entry in local-mailbox: %s", cp);
+ return 0;
+ }
+
+ /*
+ * Sigh, it turns out that the address parser gets messed up
+ * if you don't call getname() until it returns NULL.
+ */
+
+ while ((cp = getname(am)) != NULL)
+ ;
+ }
+
if ((am = context_find ("alternate-mailboxes")) == NULL)
am = getusername();
else {
if (np == NULL) /* XXX */
return 0;
- switch (np->m_type) {
- case NETHOST:
- len = strlen (cp = LocalName ());
- if (!uprf (np->m_host, cp) || np->m_host[len] != '.')
- break;
- goto local_test;
+ /*
+ * Don't perform this "local" test if we have a Local-Mailbox set
+ */
- case UUCPHOST:
- if (mh_strcasecmp (np->m_host, SystemName()))
- break; /* fall */
- case LOCALHOST:
+ if (! localmailbox)
+ switch (np->m_type) {
+ case NETHOST:
+ len = strlen (cp = LocalName (0));
+ if (!uprf (np->m_host, cp) || np->m_host[len] != '.')
+ break;
+ goto local_test;
+
+ case UUCPHOST:
+ if (mh_strcasecmp (np->m_host, SystemName()))
+ break; /* fall */
+ case LOCALHOST:
local_test: ;
- if (!mh_strcasecmp (np->m_mbox, mq.m_mbox))
- return 1;
- break;
+ if (!mh_strcasecmp (np->m_mbox, mq.m_mbox))
+ return 1;
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
/*
* Now scan through list of alternate
for (mp = &mq; mp->m_next;) {
mp = mp->m_next;
if (!np->m_mbox)
- continue;
- if ((len = strlen (cp = np->m_mbox))
+ continue; if ((len = strlen (cp = np->m_mbox))
< (i = strlen (pp = mp->m_mbox)))
continue;
switch (mp->m_type & W_MBOX) {