/*
* 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 <h/mh.h>
#include <h/addrsbr.h>
-#include <zotnet/mf/mf.h>
+#include <h/mf.h>
/* 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
static char err[BUFSIZ];
static char adr[BUFSIZ];
+
+extern boolean username_extension_masquerading; /* defined in mts.c */
+
+
/*
* external prototypes
*/
{
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
}
if (dfhost == NULL) {
- dfhost = LocalName ();
+ dfhost = LocalName (0);
dftype = LOCALHOST;
}
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;
}
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)
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)
/*
- * 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;
}
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
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;
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:
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: