X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Faddrsbr.c;h=fc026fbef98369294f08b222fab7a0d67f5cf756;hb=49e0326aeef4cdc75898bf3049bfa3c123688e0f;hp=8a468bbb141b72c3086e15801236fa55076ddb67;hpb=f931795fd8973c1edb40a26ecf87dbe27f7a6148;p=mmh diff --git a/sbr/addrsbr.c b/sbr/addrsbr.c index 8a468bb..fc026fb 100644 --- a/sbr/addrsbr.c +++ b/sbr/addrsbr.c @@ -10,6 +10,7 @@ #include #include #include +#include /* High level parsing of addresses: @@ -76,15 +77,6 @@ static char err[BUFSIZ]; static char adr[BUFSIZ]; -extern boolean username_extension_masquerading; /* defined in mts.c */ - - -/* - * external prototypes - */ -char *getusername (void); - - char * getname (char *addrs) { @@ -296,47 +288,11 @@ auxformat (struct mailname *mp, int extras) char * getlocaladdr(void) { - int snprintf_return; - char *username, *domain; - static char addr[BUFSIZ]; + char *username; 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 >= (int) 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; - } - } - return username; - - domain = LocalName(0); - - snprintf_return = snprintf (addr, sizeof(addr), "%s@%s", username, domain); - - if (snprintf_return < 0 || snprintf_return >= (int) 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; } @@ -364,6 +320,7 @@ ismymbox (struct mailname *np) struct mailname *mp; static char *am = NULL; static struct mailname mq; + static int localmailbox = 0; /* * If this is the first call, initialize @@ -372,6 +329,30 @@ ismymbox (struct mailname *np) 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 { @@ -417,25 +398,30 @@ ismymbox (struct mailname *np) if (np == NULL) /* XXX */ return 0; - 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; + /* + * 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 @@ -444,8 +430,7 @@ local_test: ; 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) {