** messages you are replying to. If the variable is unset, the
** \fIFrom:\fP line will use your address on the current machine.
*/
+ { "rewrite_uucp", DT_BOOL, R_INDEX, OPTREWRITEUUCP, 0 },
+ /*
+ ** .pp
+ ** When this option is set, mutt rewrites uucp-style "bang paths" to
+ ** internet addresses.
+ */
{ "rfc2047_parameters", DT_BOOL, R_NONE, OPTRFC2047PARAMS, 0 },
/*
** .pp
return s;
}
+
+
static const char *
parse_address (const char *s,
char *token, size_t *tokenlen, size_t tokenmax,
token[*tokenlen] = 0;
addr->mailbox = safe_strdup (token);
-
+
if (*commentlen && !addr->personal)
{
comment[*commentlen] = 0;
return top;
}
+static short
+rewrite_uucp (char *dest, char *src, size_t destlen)
+{
+ char *domain, *user, *tmp;
+ short quoted, quoted_string;
+
+ if (!src || !*src)
+ return -1;
+
+ for (user = tmp = src, domain = NULL, quoted = quoted_string = 0; *tmp; tmp++)
+ {
+ switch (*tmp)
+ {
+ case '"': if (!quoted) quoted_string ^= 1; quoted = 0; break;
+ case '@': return -1;
+ case '\\': quoted ^= 1; break;
+ case '!': if (!quoted && !quoted_string) { domain = user; user = tmp + 1; }
+ default: quoted = 0; break;
+ }
+ }
+
+ if (domain == NULL)
+ return -1;
+
+ if (destlen <= tmp - domain)
+ return -1;
+
+ snprintf (dest, tmp - domain + 1, "%s@%s", user, domain);
+ return 0;
+}
+
void rfc822_qualify (ADDRESS *addr, const char *host)
{
char *p;
{
if (!buflen)
goto done;
- strfcpy (pbuf, addr->mailbox, buflen);
+ if (!option (OPTREWRITEUUCP) ||
+ rewrite_uucp (pbuf, addr->mailbox, buflen) == -1)
+ strfcpy (pbuf, addr->mailbox, buflen);
len = mutt_strlen (pbuf);
pbuf += len;
buflen -= len;