X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Faddrsbr.c;h=fc026fbef98369294f08b222fab7a0d67f5cf756;hb=49e0326aeef4cdc75898bf3049bfa3c123688e0f;hp=649e06f4631f226555dde622820e4110c1a6de9d;hpb=19f0a0fb37951be3155401e02425cb25365ff601;p=mmh diff --git a/sbr/addrsbr.c b/sbr/addrsbr.c index 649e06f..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) { @@ -145,7 +137,7 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) } if (dfhost == NULL) { - dfhost = LocalName (); + dfhost = LocalName (0); dftype = LOCALHOST; } @@ -202,10 +194,10 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) } 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) @@ -287,54 +279,20 @@ auxformat (struct mailname *mp, int extras) /* - * 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; } @@ -361,7 +319,8 @@ ismymbox (struct mailname *np) 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 @@ -370,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 { @@ -415,25 +398,30 @@ ismymbox (struct mailname *np) 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 @@ -442,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) {