X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;ds=sidebyside;f=sbr%2Faddrsbr.c;h=ffdac3ffea78a45725f5c143c29e30d556d7fa8f;hb=4e0b71d26ea73fe5ae324cc9c5caa7f204760781;hp=d1fd730dbb7bd3425c1f46693474c4f65d9d0f06;hpb=3c9700d8d045f3ff26ce5dd2a174454dafc14822;p=mmh diff --git a/sbr/addrsbr.c b/sbr/addrsbr.c index d1fd730..ffdac3f 100644 --- a/sbr/addrsbr.c +++ b/sbr/addrsbr.c @@ -2,19 +2,24 @@ /* * addrsbr.c -- parse addresses 822-style * - * $Id$ + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ #include #include -#include +#include /* High level parsing of addresses: - The routines in zotnet/mf/mf.c parse the syntactic representations of + The routines in sbr/mf.c parse the syntactic representations of addresses. The routines in sbr/addrsbr.c associate semantics with those addresses. + The comments below are left in for historical purposes; DUMB and + REALLYDUMB are now the default in the code. + If #ifdef DUMB is in effect, a full 822-style parser is called for syntax recongition. This breaks each address into its components. Note however that no semantics are assumed about the parts or their @@ -70,6 +75,10 @@ static char *note = NULL; static char err[BUFSIZ]; static char adr[BUFSIZ]; + +extern boolean username_extension_masquerading; /* defined in mts.c */ + + /* * external prototypes */ @@ -107,11 +116,8 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) { char *pp; struct mailname *mp; -#ifndef DUMB - char *dp; -#endif /* not DUMB */ - if (err && err[0]) { + if (err[0]) { if (eresult) strcpy (eresult, err); else @@ -139,7 +145,7 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) } if (dfhost == NULL) { - dfhost = LocalName (); + dfhost = LocalName (0); dftype = LOCALHOST; } @@ -182,13 +188,11 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) else { mp->m_nohost = 1; mp->m_mbox = getcpy (mbox); -#ifdef DUMB if (route == NULL && dftype == LOCALHOST) { mp->m_host = NULL; mp->m_type = dftype; } else -#endif /* DUMB */ { mp->m_host = route ? NULL : getcpy (dfhost); mp->m_type = route ? NETHOST : dftype; @@ -198,29 +202,10 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) } if (wanthost == AD_NHST) - mp->m_type = !strcasecmp (LocalName (), mp->m_host) + mp->m_type = !mh_strcasecmp (LocalName (0), mp->m_host) ? LOCALHOST : NETHOST; -#ifdef DUMB else - mp->m_type = strcasecmp (LocalName(), mp->m_host) ? NETHOST : LOCALHOST; -#else /* not DUMB */ - else - if (pp = OfficialName (mp->m_host)) { - got_real_host: ; - free (mp->m_host); - mp->m_host = getcpy (pp); - mp->m_type = strcasecmp (LocalName(), mp->m_host) ? NETHOST : LOCALHOST; - } - else { - if (dp = strchr(mp->m_host, '.')) { - *dp = NULL; - if (pp = OfficialName (mp->m_host)) - goto got_real_host; - *dp = '.'; - } - mp->m_type = BADHOST; - } -#endif /* not DUMB */ + mp->m_type = mh_strcasecmp (LocalName(0), mp->m_host) ? NETHOST : LOCALHOST; got_host: ; if (route) @@ -268,18 +253,14 @@ auxformat (struct mailname *mp, int extras) static char addr[BUFSIZ]; static char buffer[BUFSIZ]; -#ifdef DUMB if (mp->m_nohost) strncpy (addr, mp->m_mbox ? mp->m_mbox : "", sizeof(addr)); else -#endif /* DUMB */ -#ifndef BANG if (mp->m_type != UUCPHOST) snprintf (addr, sizeof(addr), mp->m_host ? "%s%s@%s" : "%s%s", empty(mp->m_path), empty(mp->m_mbox), mp->m_host); else -#endif /* not BANG */ snprintf (addr, sizeof(addr), "%s!%s", mp->m_host, mp->m_mbox); if (!extras) @@ -306,34 +287,55 @@ 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 *local, char *domain) +getlocaladdr(void) { - static char addr[BUFSIZ]; + int snprintf_return; + char *username, *domain; + static char addr[BUFSIZ]; + + 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; + } + } - if (local == NULL) -#ifdef REALLYDUMB - return getusername (); - else -#endif /* REALLYDUMB */ - local = getusername (); + return username; - if (domain == NULL) -#ifdef REALLYDUMB - return local; - else -#endif /* REALLYDUMB */ - domain = LocalName (); + domain = LocalName(0); -#ifndef BANG - snprintf (addr, sizeof(addr), "%s@%s", local, domain); -#else /* BANG */ - snprintf (addr, sizeof(addr), "%s!%s", domain, local); -#endif /* BANG */ + 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; } @@ -361,15 +363,49 @@ ismymbox (struct mailname *np) char buffer[BUFSIZ]; struct mailname *mp; static char *am = NULL; - static struct mailname mq={NULL}; + static struct mailname mq; /* * If this is the first call, initialize * list of alternate mailboxes. */ if (am == NULL) { + if ((am = context_find ("local-mailbox"))) { + struct mailname *mptr; + + if ((cp = getname(am)) == NULL) { + admonish (NULL, "Unable to find address in local-mailbox"); + return 0; + } + + if ((mptr = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) { + admonish (NULL, "invalid entry in local-mailbox: %s", cp); + return 0; + } + + /* + * Yes, we're not freeing the whole entry, because all of those + * elements contain allocated pointers that we need; maybe + * later ... + */ + + mq = *mptr; + + free(mptr); + + /* + * 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) + ; + } else { + mq.m_mbox = getusername (); + } + mq.m_next = NULL; - mq.m_mbox = getusername (); + if ((am = context_find ("alternate-mailboxes")) == NULL) am = getusername(); else { @@ -417,17 +453,17 @@ ismymbox (struct mailname *np) switch (np->m_type) { case NETHOST: - len = strlen (cp = LocalName ()); + len = strlen (cp = LocalName (0)); if (!uprf (np->m_host, cp) || np->m_host[len] != '.') break; goto local_test; case UUCPHOST: - if (strcasecmp (np->m_host, SystemName())) + if (mh_strcasecmp (np->m_host, SystemName())) break; /* fall */ case LOCALHOST: local_test: ; - if (!strcasecmp (np->m_mbox, mq.m_mbox)) + if (!mh_strcasecmp (np->m_mbox, mq.m_mbox)) return 1; break; @@ -448,11 +484,11 @@ local_test: ; continue; switch (mp->m_type & W_MBOX) { case W_NIL: - if (strcasecmp (cp, pp)) + if (mh_strcasecmp (cp, pp)) continue; break; case W_MBEG: - if (strcasecmp (cp + len - i, pp)) + if (mh_strcasecmp (cp + len - i, pp)) continue; break; case W_MEND: @@ -474,11 +510,11 @@ local_test: ; continue; switch (mp->m_type & W_HOST) { case W_NIL: - if (strcasecmp (cp, pp)) + if (mh_strcasecmp (cp, pp)) continue; break; case W_HBEG: - if (strcasecmp (cp + len - i, pp)) + if (mh_strcasecmp (cp + len - i, pp)) continue; break; case W_HEND: