X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Faddrsbr.c;h=79d7afe4c467dd1e075934d4c1a256f70e31a5a6;hb=f6aa95b724fd8c791164abe7ee5468bf5c34f226;hp=d1fd730dbb7bd3425c1f46693474c4f65d9d0f06;hpb=3c9700d8d045f3ff26ce5dd2a174454dafc14822;p=mmh diff --git a/sbr/addrsbr.c b/sbr/addrsbr.c index d1fd730..79d7afe 100644 --- a/sbr/addrsbr.c +++ b/sbr/addrsbr.c @@ -2,16 +2,18 @@ /* * 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. @@ -70,6 +72,10 @@ static char *note = NULL; static char err[BUFSIZ]; static char adr[BUFSIZ]; + +extern boolean username_extension_masquerading; /* defined in mts.c */ + + /* * external prototypes */ @@ -111,7 +117,7 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) char *dp; #endif /* not DUMB */ - if (err && err[0]) { + if (err[0]) { if (eresult) strcpy (eresult, err); else @@ -198,18 +204,18 @@ 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 (), mp->m_host) ? LOCALHOST : NETHOST; #ifdef DUMB else - mp->m_type = strcasecmp (LocalName(), mp->m_host) ? NETHOST : LOCALHOST; + mp->m_type = mh_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; + mp->m_type = mh_strcasecmp (LocalName(), mp->m_host) ? NETHOST : LOCALHOST; } else { if (dp = strchr(mp->m_host, '.')) { @@ -310,30 +316,55 @@ auxformat (struct mailname *mp, int extras) */ char * -adrsprintf (char *local, char *domain) +adrsprintf (char *username, char *domain) { - static char addr[BUFSIZ]; + 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; + } + } - if (local == NULL) #ifdef REALLYDUMB - return getusername (); - else -#endif /* REALLYDUMB */ - local = getusername (); + return username; +#endif if (domain == NULL) -#ifdef REALLYDUMB - return local; - else -#endif /* REALLYDUMB */ - domain = LocalName (); + domain = LocalName(); #ifndef BANG - snprintf (addr, sizeof(addr), "%s@%s", local, domain); + snprintf_return = snprintf (addr, sizeof(addr), "%s@%s", username, domain); #else /* BANG */ - snprintf (addr, sizeof(addr), "%s!%s", domain, local); + snprintf_return = snprintf (addr, sizeof(addr), "%s!%s", domain, username); #endif /* BANG */ + 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; } @@ -423,11 +454,11 @@ ismymbox (struct mailname *np) 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 +479,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 +505,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: @@ -495,3 +526,51 @@ local_test: ; return 0; } + + +/* + * Moved from hosts.c -- find out the official name of a host + */ + +/* + * In the SendMail world, we really don't know what the valid + * hosts are. We could poke around in the sendmail.cf file, but + * that still isn't a guarantee. As a result, we'll say that + * everything is a valid host, and let SendMail worry about it. + */ + +#include +#include + + +char * +OfficialName (char *name) +{ + unsigned char *p; + char *q, site[BUFSIZ]; + struct addrinfo hints, *res; + + static char buffer[BUFSIZ]; + + for (p = name, q = site; *p && (q - site < sizeof(site) - 1); p++, q++) + *q = isupper (*p) ? tolower (*p) : *p; + *q = '\0'; + q = site; + + if (!mh_strcasecmp (LocalName(), site)) + return LocalName(); + + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_CANONNAME; + hints.ai_family = PF_UNSPEC; + + if (getaddrinfo(q, NULL, &hints, &res) == 0) { + strncpy (buffer, res->ai_canonname, sizeof(buffer)); + buffer[sizeof(buffer) - 1] = '\0'; + freeaddrinfo(res); + return buffer; + } + + strncpy (buffer, site, sizeof(buffer)); + return buffer; +}