aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/filenames.h17
-rw-r--r--lib/libmf.h1
-rw-r--r--lib/utils.c7
-rw-r--r--mflib/callout.mf411
-rw-r--r--mflib/spf.mf4
-rw-r--r--src/builtin/callout.bi21
-rw-r--r--src/callout.h1
-rw-r--r--src/calloutd.c4
-rw-r--r--src/gram.y15
-rw-r--r--src/mailfromd.h2
-rw-r--r--src/main.c78
-rw-r--r--src/srvcfg.c73
-rw-r--r--src/srvcfg.h35
13 files changed, 158 insertions, 111 deletions
diff --git a/lib/filenames.h b/lib/filenames.h
index c3e1ca43..6deae3d1 100644
--- a/lib/filenames.h
+++ b/lib/filenames.h
@@ -1,4 +1,21 @@
+/* This file is part of Mailfromd.
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Sergey Poznyakoff
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
/* Default file names */
+#define DEFAULT_PIDFILE "mailfromd.pid"
#define DEFAULT_CALLOUT_SOCKET "callout"
#define DEFAULT_DATABASE "mailfromd.db"
#define DEFAULT_RATE_DATABASE "rates.db"
diff --git a/lib/libmf.h b/lib/libmf.h
index 18192304..2249865a 100644
--- a/lib/libmf.h
+++ b/lib/libmf.h
@@ -132,6 +132,7 @@ int config_cb_timeout (struct timeval *pt, mu_debug_t debug,
void mf_proctitle_init (int argc, char *argv[], char *env[]);
void mf_proctitle_format (const char *fmt, ...);
int stderr_closed_p(void);
+int mf_list_compare_string(const void *item, const void *value);
struct symtab;
diff --git a/lib/utils.c b/lib/utils.c
index 62517775..8460849d 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -128,6 +128,13 @@ stderr_closed_p()
return fd <= 2;
}
+
+int
+mf_list_compare_string(const void *item, const void *value)
+{
+ return strcmp(item, value);
+}
+
diff --git a/mflib/callout.mf4 b/mflib/callout.mf4
index a1bc5b9e..016cc241 100644
--- a/mflib/callout.mf4
+++ b/mflib/callout.mf4
@@ -22,9 +22,10 @@ require status
dclex e_callout_proto
-/* FIXME: Use mydomain? */
-precious string ehlo_domain
-precious string mailfrom_address
+m4_dnl The following two variables are defined in callout.bi
+m4_dnl Perhaps someday they will be defined here.
+m4_dnl precious string ehlo_domain
+m4_dnl precious string mailfrom_address
string last_poll_greeting
string last_poll_helo
@@ -50,12 +51,14 @@ do
if not reply matches 'OK.*'
throw e_callout_proto reply
fi
+ m4_ifelse([<
+ # Set command is not yet supported by the server.
if ehlo_domain
setvar(fd, "EHLO", ehlo_domain)
fi
if mailfrom_address
setvar(fd, "MAILFROM", mailfrom_address)
- fi
+ fi>])
return fd
done
diff --git a/mflib/spf.mf b/mflib/spf.mf
index 0d9b315f..90f50456 100644
--- a/mflib/spf.mf
+++ b/mflib/spf.mf
@@ -16,7 +16,7 @@
module 'spf'.
require 'safedb'
-require 'mydomain'
+
#pragma regex push +extended +icase
set spf_database "%__statedir__/spf.db"
@@ -114,7 +114,7 @@ do
number result __spf_get_cache(ip, domain, sender)
if result == -1
- set result spf_check_host(ip, domain, sender, helo, my_domain)
+ set result spf_check_host(ip, domain, sender, helo, ehlo_domain)
if result = None
set spf_ttl spf_negative_ttl
diff --git a/src/builtin/callout.bi b/src/builtin/callout.bi
index 43facfc0..9c8affeb 100644
--- a/src/builtin/callout.bi
+++ b/src/builtin/callout.bi
@@ -16,8 +16,12 @@
/* Run-time support for callout functions */
#include "filenames.h"
+#include "callout.h"
MF_VAR(callout_server_url, STRING, SYM_PRECIOUS);
+MF_VAR(ehlo_domain, STRING, SYM_PRECIOUS);
+MF_VAR(mailfrom_address, STRING, SYM_PRECIOUS);
+
int provide_callout;
/* #pragma provide-callout */
@@ -26,13 +30,22 @@ MF_PRAGMA(provide-callout, 1, 1)
provide_callout = 1;
}
-MF_INIT([<
+static void
+initvar(const char *name, const char *str)
+{
struct value val;
val.type = dtype_string;
- val.v.literal = string_alloc(DEFAULT_CALLOUT_SOCKET,
- sizeof(DEFAULT_CALLOUT_SOCKET)-1);
- ensure_initialized_variable("callout_server_url", &val);
+ val.v.literal = string_alloc(str, strlen(str));
+ ensure_initialized_variable(name, &val);
+}
+
+MF_INIT([<
+ initvar("callout_server_url", default_callout_url);
+ if (ehlo_domain)
+ initvar("ehlo_domain", ehlo_domain);
+ if (mailfrom_address)
+ initvar("mailfrom_address", mailfrom_address);
>])
diff --git a/src/callout.h b/src/callout.h
index 6d9c422f..ce7e3ec1 100644
--- a/src/callout.h
+++ b/src/callout.h
@@ -32,7 +32,6 @@ extern char *mailfrom_address;
extern size_t callout_debug_handle;
-
const char *mf_status_str(mf_status s);
/* callout.c */
diff --git a/src/calloutd.c b/src/calloutd.c
index 1b338b02..df14c0b2 100644
--- a/src/calloutd.c
+++ b/src/calloutd.c
@@ -131,9 +131,9 @@ static struct argp argp = {
int
-mf_server_function(const char *key, mfd_server_func_t *pret)
+mf_server_function(const char *key, struct mf_srvcfg *cfg)
{
- *pret = callout_session_server;
+ cfg->server = callout_session_server;
return 0;
}
diff --git a/src/gram.y b/src/gram.y
index b4a4590b..b2450171 100644
--- a/src/gram.y
+++ b/src/gram.y
@@ -2700,7 +2700,8 @@ register_macro(enum smtp_state state, const char *macro)
return;
if (!smtp_macro_list[ind]) {
mu_list_create(&smtp_macro_list[ind]);
- mu_list_set_comparator(smtp_macro_list[ind], compare_string);
+ mu_list_set_comparator(smtp_macro_list[ind],
+ mf_list_compare_string);
}
/* FIXME: MU: 2nd arg should be const? */
if (mu_list_locate(smtp_macro_list[ind], (void*) macro, NULL))
@@ -3750,8 +3751,9 @@ apply_deferred_init()
for (p = deferred_decl; p; p = p->next) {
struct variable *var = variable_lookup(p->name->text);
if (!var) {
- mu_error(_("<command line>: warning: no such variable: %s"),
- p->name->text);
+ mu_error(_("<command line>: warning: "
+ "no such variable: %s"),
+ p->name->text);
continue;
}
if (initialize_variable(var, &p->value, NULL))
@@ -3826,7 +3828,12 @@ initialize_variable(struct variable *var, struct value *val,
dv = xmalloc(sizeof *dv);
dv->next = declvar;
dv->var = var;
- dv->locus = *locus;
+ if (locus)
+ dv->locus = *locus;
+ else {
+ dv->locus.file = "<unknown>";
+ dv->locus.line = 1;
+ }
dv->val = *val;
declvar = dv;
var->sym.flags |= SYM_INITIALIZED;
diff --git a/src/mailfromd.h b/src/mailfromd.h
index 2dc0d143..ca0ec0da 100644
--- a/src/mailfromd.h
+++ b/src/mailfromd.h
@@ -139,6 +139,7 @@ extern int script_dump_macros;
extern int script_dump_xref;
extern int stack_trace_option;
extern const char *program_version;
+extern char *default_callout_url;
extern size_t stack_size;
extern size_t stack_max_size;
@@ -900,7 +901,6 @@ void milter_settimeout(time_t t);
int xeval(eval_environ_t env, enum smtp_state tag);
int relayed_domain_p(char *name);
-int compare_string(const void *item, const void *value);
size_t mem_search(const char *str, int c, size_t size);
diff --git a/src/main.c b/src/main.c
index ba36fd92..ccd31e69 100644
--- a/src/main.c
+++ b/src/main.c
@@ -78,6 +78,7 @@ int stack_trace_option; /* Print stack traces on runtime errors */
size_t max_match_mx = MAXMXCOUNT;
char *main_function_name = "main";
+char *default_callout_url = DEFAULT_CALLOUT_SOCKET;
/* Preprocessor helper function */
@@ -178,12 +179,6 @@ log_status(sfsistat status, SMFICTX *ctx)
static mu_list_t domain_list;
-int
-compare_string(const void *item, const void *value)
-{
- return strcmp(item, value);
-}
-
/* Read domains from sendmail-style domain file NAME and store them in
DOMAIN_LIST */
int
@@ -202,7 +197,7 @@ read_domain_file(mu_debug_t err, const char *name)
if (!domain_list) {
mu_list_create(&domain_list);
- mu_list_set_comparator(domain_list, compare_string);
+ mu_list_set_comparator(domain_list, mf_list_compare_string);
}
while (p = fgets(buf, sizeof buf, fp)) {
@@ -795,40 +790,6 @@ cb_set_variable(mu_debug_t err, void *data, mu_config_value_t *arg)
}
static int
-cb_ehlo_domain(mu_debug_t err, void *data, mu_config_value_t *arg)
-{
- if (mu_cfg_assert_value_type(arg, MU_CFG_STRING, err))
- return 1;
- defer_initialize_variable("ehlo_domain", arg->v.string);
- return 0;
-}
-
-static int
-mf_option_mailfrom(mu_debug_t err, const char *arg)
-{
- int rc;
- mu_address_t addr;
-
- rc = mu_address_create(&addr, arg);
- if (rc) {
- mf_error_on_locus(err, _("cannot create address `%s': %s"),
- arg, mu_strerror(rc));
- return 1;
- }
- mu_address_destroy(&addr);
- defer_initialize_variable("mailfrom_address", arg);
- return 0;
-}
-
-static int
-cb_mail_from_address(mu_debug_t err, void *data, mu_config_value_t *arg)
-{
- if (mu_cfg_assert_value_type(arg, MU_CFG_STRING, err))
- return 1;
- return mf_option_mailfrom(err, arg->v.string);
-}
-
-static int
cb_include_path(mu_debug_t err, void *data, mu_config_value_t *val)
{
int i, rc = 0;
@@ -933,21 +894,10 @@ struct mu_cfg_param mf_cfg_param[] = {
{ "milter-timeout", mu_cfg_callback, NULL, 0, cb_milter_timeout,
N_("Set milter timeout."),
N_("time") },
-#if 0
- /* FIXME */
- { "io-timeout", mu_cfg_callback, &io_timeout, 0, cb_timeout,
- N_("Timeout for all SMTP I/O operations."),
- N_("time") },
-#endif
-
- { "ehlo-domain", mu_cfg_callback, NULL, 0, cb_ehlo_domain,
- N_("Set the domain name for EHLO command.") },
- { "mail-from-address", mu_cfg_callback, NULL, 0, cb_mail_from_address,
- N_("Set email address for use in SMTP `MAIL FROM' command. "
- "Argument is an email address or a comma-separated list of "
- "addresses. Use <> for null address. Other addresses can "
- "be given without angle brackets."),
- N_("addr") },
+ { "callout-url", mu_cfg_string, &default_callout_url, 0, NULL,
+ N_("Sets the URL of the default callout server. "
+ "Deprecated. Use `setvar callout_server_url <url>;' instead."),
+ N_("url") },
{ "include-path", mu_cfg_callback, NULL, 0, cb_include_path,
N_("Add directories to the list of directories to be searched for "
"header files. Argument is a list of directory names "
@@ -1177,12 +1127,18 @@ static char *modnames[] = {
int
-mf_server_function(const char *key, mfd_server_func_t *pret)
+mf_server_function(const char *key, struct mf_srvcfg *cfg)
{
if (!key || strcmp(key, "default") == 0 || strcmp(key, "milter") == 0)
- *pret = milter_session_server;
- else if (strcmp(key, "callout") == 0)
- *pret = callout_session_server;
+ cfg->server = milter_session_server;
+ else if (strcmp(key, "callout") == 0) {
+ cfg->server = callout_session_server;
+ if (cfg->defopt ||
+ mu_list_locate(cfg->options, "default", NULL))
+ default_callout_url =
+ xstrdup(mu_url_to_string(cfg->url));
+ } else
+ return 1;
return 0;
}
@@ -1238,6 +1194,7 @@ main(int argc, char **argv)
if (rc)
exit(EX_CONFIG);
flush_arguments(&args);
+ mf_srvcfg_flush();
alloc_ext_pp();
@@ -1282,7 +1239,6 @@ main(int argc, char **argv)
if (parse_program(script_file, script_ydebug))
exit(EX_CONFIG);
}
- mf_srvcfg_flush();
fixup_create_script();
diff --git a/src/srvcfg.c b/src/srvcfg.c
index b9988446..26f7fdd1 100644
--- a/src/srvcfg.c
+++ b/src/srvcfg.c
@@ -26,6 +26,7 @@
#include "inttostr.h"
#include "libmf.h"
+#include "filenames.h"
#include "callout.h"
#include "debug.h"
#include "srvman.h"
@@ -72,8 +73,6 @@ time_t negative_expire_interval = DEFAULT_EXPIRE_INTERVAL/2;
/* Expire negative cache entries after this
number of seconds */
-extern int mf_server_function(const char *key, mfd_server_func_t *pret);
-
static const char *
next_server_id()
@@ -115,7 +114,7 @@ _parse_url(mu_debug_t err, const char *str)
return url;
}
-static mu_url_t
+mu_url_t
parse_milter_url(mu_debug_t err, const char *str)
{
mu_url_t url;
@@ -282,19 +281,28 @@ option_state_directory(char *opt, void **pval, char *newval)
void
mf_srvcfg_add(const char *type, const char *urlstr)
{
- mu_url_t url;
- const char *id = next_server_id();
mu_debug_t dbg;
- mfd_server_func_t server;
+ struct mf_srvcfg cfg;
mu_diag_get_debug(&dbg);
- if (mf_server_function(type, &server)) {
- mu_error(_("INTERNAL ERROR: no such server type: %s"), type);
- exit(EX_SOFTWARE);
- }
- url = parse_milter_url(dbg, urlstr);
- if (url) {
- mfd_server_t srv = mfd_server_new(id, url, server, 0);
+
+ memset(&cfg, 0, sizeof(cfg));
+ cfg.id = next_server_id();
+ cfg.url = parse_milter_url(dbg, urlstr);
+ if (cfg.url) {
+ mfd_server_t srv;
+
+ if (mf_server_function(type, &cfg)) {
+ mu_error(_("INTERNAL ERROR: no such server type: %s"),
+ type);
+ exit(EX_SOFTWARE);
+ } else if (!cfg.server) {
+ mu_error(_("INTERNAL ERROR at %s:%d: "
+ "server function not defined"),
+ __FILE__, __LINE__);
+ exit(EX_SOFTWARE);
+ }
+ srv = mfd_server_new(cfg.id, cfg.url, cfg.server, 0);
if (srv)
mfd_srvman_attach_server(srv);
else
@@ -387,17 +395,7 @@ cb_source_ip(mu_debug_t err, void *data, mu_config_value_t *arg)
return mf_option_source_ip(err, arg->v.string, &source_address);
}
-struct server_config_stmt {
- const char *id;
- mu_url_t url;
- mu_acl_t acl;
- size_t max_children;
- mfd_server_func_t server;
- int single_process;
- int reuseaddr;
-};
-
-static struct server_config_stmt server_config_stmt;
+static struct mf_srvcfg server_config_stmt;
static int
cb_server_stmt_listen(mu_debug_t err, void *data, mu_config_value_t *arg)
@@ -430,6 +428,13 @@ struct mu_cfg_param server_section_param[] = {
N_("Reuse existing socket (default).") },
{ "acl", mu_cfg_section,
&server_config_stmt.acl },
+ { "option", MU_CFG_LIST_OF(mu_cfg_string),
+ &server_config_stmt.options, 0, NULL,
+ N_("Server-dependent options") },
+ { "default", mu_cfg_bool,
+ &server_config_stmt.defopt, 0, NULL,
+ N_("Deprecated. It is equivalemt to `option \"default\"', "
+ "i.e. it marks this callout server as the default one.") },
{ NULL }
};
@@ -447,12 +452,21 @@ server_section_parser(enum mu_cfg_section_stage stage,
if (mu_cfg_assert_value_type (node->label, MU_CFG_STRING,
tree->debug))
return 1;
- /* FIXME */
+ if (server_config_stmt.options)
+ mu_list_set_comparator(server_config_stmt.options,
+ mf_list_compare_string);
if (mf_server_function(node->label->v.string,
- &server_config_stmt.server)) {
- mu_cfg_format_error (tree->debug,
- MU_DEBUG_ERROR,
- _("unknown server type"));
+ &server_config_stmt)) {
+ mu_cfg_format_error(tree->debug,
+ MU_DEBUG_ERROR,
+ _("unknown server type"));
+ return 1;
+ } else if (!server_config_stmt.server) {
+ mu_cfg_format_error(tree->debug,
+ MU_DEBUG_ERROR,
+ _("INTERNAL ERROR at %s:%d: "
+ "server function not defined"),
+ __FILE__, __LINE__);
return 1;
}
break;
@@ -480,6 +494,7 @@ server_section_parser(enum mu_cfg_section_stage stage,
mfd_srvman_attach_server(srv);
}
}
+ mu_list_destroy(&server_config_stmt.options);
break;
}
return 0;
diff --git a/src/srvcfg.h b/src/srvcfg.h
index 6873c765..20163ab0 100644
--- a/src/srvcfg.h
+++ b/src/srvcfg.h
@@ -1,4 +1,32 @@
-#define DEFAULT_PIDFILE "mailfromd.pid"
+/* This file is part of Mailfromd.
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Sergey Poznyakoff
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "srvman.h"
+
+struct mf_srvcfg {
+ const char *id;
+ mu_url_t url;
+ mu_acl_t acl;
+ size_t max_children;
+ mfd_server_func_t server;
+ int single_process;
+ int reuseaddr;
+ mu_list_t options;
+ int defopt;
+};
extern int server_flags;
extern char *mailfromd_state_dir;
@@ -14,13 +42,14 @@ extern size_t max_callout_mx;
extern time_t smtp_timeout_soft[SMTP_NUM_TIMEOUT];
extern time_t smtp_timeout_hard[SMTP_NUM_TIMEOUT];
+extern int mf_server_function(const char *key, struct mf_srvcfg *cfg);
+
void mf_srvcfg_init(const char *label);
void mf_srvcfg_add(const char *type, const char *urlstr);
void mf_srvcfg_flush(void);
-/* int mf_server_function(const char *key, mfd_server_func_t *pret); */
void mf_error_on_locus(mu_debug_t err, const char *fmt, ...)
MU_PRINTFLIKE(2,3);
-
+mu_url_t parse_milter_url(mu_debug_t err, const char *str);

Return to:

Send suggestions and report system problems to the System administrator.