{ "bounce_message_file", opt_stringptr, &bounce_message_file },
{ "bounce_message_text", opt_stringptr, &bounce_message_text },
{ "bounce_return_body", opt_bool, &bounce_return_body },
+ { "bounce_return_linesize_limit", opt_mkint, &bounce_return_linesize_limit },
{ "bounce_return_message", opt_bool, &bounce_return_message },
{ "bounce_return_size_limit", opt_mkint, &bounce_return_size_limit },
{ "bounce_sender_authentication",opt_stringptr,&bounce_sender_authentication },
{ "envelope_to_remove", opt_bool, &envelope_to_remove },
{ "errors_copy", opt_stringptr, &errors_copy },
{ "errors_reply_to", opt_stringptr, &errors_reply_to },
-#ifdef EXPERIMENTAL_EVENT
+#ifndef DISABLE_EVENT
{ "event_action", opt_stringptr, &event_action },
#endif
{ "exim_group", opt_gid, &exim_gid },
#ifdef EXIM_PERL
{ "perl_at_start", opt_bool, &opt_perl_at_start },
{ "perl_startup", opt_stringptr, &opt_perl_startup },
+ { "perl_taintmode", opt_bool, &opt_perl_taintmode },
#endif
#ifdef LOOKUP_PGSQL
{ "pgsql_servers", opt_stringptr, &pgsql_servers },
{ "recipient_unqualified_hosts", opt_stringptr, &recipient_unqualified_hosts },
{ "recipients_max", opt_int, &recipients_max },
{ "recipients_max_reject", opt_bool, &recipients_max_reject },
-#ifdef EXPERIMENTAL_REDIS
+#ifdef LOOKUP_REDIS
{ "redis_servers", opt_stringptr, &redis_servers },
#endif
{ "remote_max_parallel", opt_int, &remote_max_parallel },
for (i = config_lines; i; i = i->next)
{
- const uschar *current;
+ uschar *current;
uschar *p;
/* skip over to the first non-space */
if (*current == '\0')
continue;
- /* TODO: Collapse or insert spaces around the first '=' */
+ /* Collapse runs of spaces. We stop this if we encounter one of the
+ * following characters: "'$, as this may indicate careful formatting */
+ for (p = current; *p; ++p)
+ {
+ uschar *next;
+ if (!isspace(*p)) continue;
+ if (*p != ' ') *p = ' ';
+
+ for (next = p; isspace(*next); ++next)
+ ;
+
+ if (next - p > 1)
+ memmove(p+1, next, Ustrlen(next)+1);
+
+ if (*next == '"' || *next == '\'' || *next == '$')
+ break;
+ }
/* # lines */
if (current[0] == '#')
- {
- puts(current);
- continue;
- }
+ puts(CCS current);
/* begin lines are left aligned */
- if (strncmp(current, "begin", 5) == 0 && isspace(current[5]))
+ else if (Ustrncmp(current, "begin", 5) == 0 && isspace(current[5]))
{
- puts(current);
+ puts("");
+ puts(CCS current);
indent = TS;
- continue;
}
/* router/acl/transport block names */
- if (current[strlen(current)-1] == ':' && !strchr(current, '='))
+ else if (current[Ustrlen(current)-1] == ':' && !Ustrchr(current, '='))
{
- printf("%*s%s\n", TS, "", current);
+ printf("\n%*s%s\n", TS, "", current);
indent = 2 * TS;
- continue;
}
- /* hidden lines (MACROS or prefixed with hide) */
- if (!admin && (isupper(*current)
- || (strncmp(current, "hide", 4) == 0 && isspace(current[4]))))
+ /* hidden lines (all MACROS or lines prefixed with "hide") */
+ else if ( !admin
+ && ( isupper(*current)
+ || Ustrncmp(current, "hide", 4) == 0 && isspace(current[4])
+ )
+ )
{
- if (p = strchr(current, '='))
+ if ((p = Ustrchr(current, '=')))
{
*p = '\0';
- printf("%*s%s = %s\n", indent, "", current, hidden);
+ printf("%*s%s= %s\n", indent, "", current, hidden);
}
/* e.g.: hide split_spool_directory */
- else printf("%*s\n", indent, hidden);
- continue;
+ else
+ printf("%*s\n", indent, hidden);
}
- /* rest is public */
- printf("%*s%s\n", indent, "", current);
- continue;
+ else
+ /* rest is public */
+ printf("%*s%s\n", indent, "", current);
}
}