aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mflib/callout.mf413
-rw-r--r--mflib/poll.mf31
-rw-r--r--src/builtin/callout.bi9
-rw-r--r--src/mailfromd.h2
-rw-r--r--src/main.c22
-rw-r--r--src/srvcfg.c10
6 files changed, 55 insertions, 32 deletions
diff --git a/mflib/callout.mf4 b/mflib/callout.mf4
index ba19b1e3..6dcf6df0 100644
--- a/mflib/callout.mf4
+++ b/mflib/callout.mf4
@@ -133,26 +133,35 @@ do
return e_not_found
fi
return 0
done
#pragma provide-callout
+precious string callout_server_url
precious number __callout_fd -1
+begin
+do
+ if callout_server_url == ""
+ set callout_server_url default_callout_server_url()
+ fi
+done
+
func __callout_open_default()
+ returns number
do
if __callout_fd == -1
set __callout_fd callout_open(callout_server_url)
fi
+ return __callout_fd
done
func callout(string email)
returns number
do
- __callout_open_default()
- return callout_do(__callout_fd, email)
+ return callout_do(__callout_open_default(), email)
done
diff --git a/mflib/poll.mf b/mflib/poll.mf
index d05a6f8b..2ce6ad73 100644
--- a/mflib/poll.mf
+++ b/mflib/poll.mf
@@ -14,38 +14,53 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
module 'poll'.
require 'callout'
+static func __make_extra_arg(string arg, string ehlo, string mailfrom)
+ returns string
+do
+ if ehlo != ""
+ set arg arg . " EHLO=%ehlo"
+ fi
+ if mailfrom != ""
+ set arg arg . " MAILFROM=%mailfrom"
+ fi
+ return arg
+done
+
func _pollhost(string ip, string email, string domain, string mailfrom)
returns number
do
- __callout_open_default()
- return callout_do(__callout_fd, email, "MODE=hostonly HOST=%ip EHLO=%domain MAILFROM=%mailfrom")
+ return callout_do(__callout_open_default(), email,
+ __make_extra_arg("MODE=hostonly HOST=%ip",
+ domain, mailfrom))
done
func _pollmx (string domain, string email, string ehlo, string mailfrom)
returns number
do
- __callout_open_default()
- return callout_do(__callout_fd, email, "MODE=mxonly HOST=%domain EHLO=%ehlo MAILFROM=%mailfrom")
+ return callout_do(__callout_open_default(), email,
+ __make_extra_arg("MODE=mxonly HOST=%domain",
+ ehlo, mailfrom))
done
func stdpoll(string email, string ehlo, string mailfrom)
returns number
do
- __callout_open_default()
- return callout_do(__callout_fd, email, "MODE=mxfirst EHLO=%ehlo MAILFROM=%mailfrom")
+ return callout_do(__callout_open_default(), email,
+ __make_extra_arg("MODE=mxfirst", ehlo, mailfrom))
done
func strictpoll(string host, string email, string ehlo, string mailfrom)
returns number
do
- __callout_open_default()
- return callout_do(__callout_fd, email, "MODE=hostfirst EHLO=%ehlo MAILFROM=%mailfrom")
+ return callout_do(__callout_open_default(), email,
+ __make_extra_arg("MODE=hostfirst HOST=%host",
+ ehlo, mailfrom))
done
diff --git a/src/builtin/callout.bi b/src/builtin/callout.bi
index 9c8affeb..dd4a61ee 100644
--- a/src/builtin/callout.bi
+++ b/src/builtin/callout.bi
@@ -15,36 +15,41 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* 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 */
MF_PRAGMA(provide-callout, 1, 1)
{
provide_callout = 1;
}
+MF_DEFUN(default_callout_server_url, STRING)
+{
+ MF_RETURN_STRING(callout_server_url ?
+ callout_server_url : DEFAULT_CALLOUT_SOCKET);
+}
+END
+
static void
initvar(const char *name, const char *str)
{
struct value val;
val.type = dtype_string;
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/mailfromd.h b/src/mailfromd.h
index 6fcc628f..37aa1c83 100644
--- a/src/mailfromd.h
+++ b/src/mailfromd.h
@@ -136,13 +136,13 @@ extern enum smtp_state test_state;
extern int regex_flags;
extern size_t variable_count;
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 char *callout_server_url;
extern size_t stack_size;
extern size_t stack_max_size;
extern size_t stack_expand_incr;
enum stack_expand_policy {
stack_expand_twice,
diff --git a/src/main.c b/src/main.c
index ccd31e69..1620fa2b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -75,13 +75,13 @@ unsigned optimization_level = 1; /* Optimization level */
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;
+char *callout_server_url;
/* Preprocessor helper function */
static void
add_pp_option(const char *opt, const char *arg)
{
@@ -891,15 +891,14 @@ struct mu_cfg_param mf_cfg_param[] = {
{ "stack-trace", mu_cfg_bool, &stack_trace_option, 0, NULL,
N_("Dump stack traces on runtime errors.") },
{ "milter-timeout", mu_cfg_callback, NULL, 0, cb_milter_timeout,
N_("Set milter timeout."),
N_("time") },
- { "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."),
+ { "callout-url", mu_cfg_string, &callout_server_url, 0, NULL,
+ N_("Sets the URL of the default callout server."),
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 "
"separated by colons."),
N_("path") },
@@ -1101,22 +1100,17 @@ provide_default_milter_server()
static void
provide_default_callout_server()
{
struct variable *var;
if (provide_callout &&
+ !callout_server_url &&
(!(var = variable_lookup("callout_server_url")) ||
(var->sym.flags & SYM_REFERENCED) &&
!(var->sym.flags & SYM_INITIALIZED))) {
- 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);
- mf_srvcfg_add("callout", val.v.literal->text);
+ mf_srvcfg_add("callout", DEFAULT_CALLOUT_SOCKET);
}
}
static char *modnames[] = {
#define __DBGMOD_C_ARRAY
@@ -1131,14 +1125,14 @@ mf_server_function(const char *key, struct mf_srvcfg *cfg)
{
if (!key || strcmp(key, "default") == 0 || strcmp(key, "milter") == 0)
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 =
+ mu_list_locate(cfg->options, "default", NULL) == 0)
+ callout_server_url =
xstrdup(mu_url_to_string(cfg->url));
} else
return 1;
return 0;
}
@@ -1181,13 +1175,13 @@ main(int argc, char **argv)
mf_optcache_add(option_cache, 0, MF_OCF_NULL|MF_OCF_STATIC);
mf_server_save_cmdline(argc, argv);
mu_acl_cfg_init();
database_cfg_init();
srvman_init();
- mf_srvcfg_init(N_("(milter | server)"));
+ mf_srvcfg_init(N_("(milter | callout)"));
mu_argp_init(program_version, "<" PACKAGE_BUGREPORT ">");
mu_app_rcfile = DEFAULT_CONFIG_FILE;
init_arguments(&args);
rc = mfd_app_init(&argp, capa, mf_cfg_param, argc, argv,
argpflag(argc, argv), &index, &args, NULL);
diff --git a/src/srvcfg.c b/src/srvcfg.c
index 26f7fdd1..af444bfa 100644
--- a/src/srvcfg.c
+++ b/src/srvcfg.c
@@ -446,15 +446,18 @@ server_section_parser(enum mu_cfg_section_stage stage,
mu_cfg_tree_t *tree)
{
switch (stage) {
case mu_cfg_section_start:
memset(&server_config_stmt, 0, sizeof(server_config_stmt));
server_config_stmt.reuseaddr = 1;
- if (mu_cfg_assert_value_type (node->label, MU_CFG_STRING,
- tree->debug))
+ if (mu_cfg_assert_value_type(node->label, MU_CFG_STRING,
+ tree->debug))
return 1;
+ break;
+
+ case mu_cfg_section_end:
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)) {
mu_cfg_format_error(tree->debug,
@@ -466,15 +469,12 @@ server_section_parser(enum mu_cfg_section_stage stage,
MU_DEBUG_ERROR,
_("INTERNAL ERROR at %s:%d: "
"server function not defined"),
__FILE__, __LINE__);
return 1;
}
- break;
-
- case mu_cfg_section_end:
if (!server_config_stmt.id)
server_config_stmt.id = next_server_id();
if (server_config_stmt.url && server_config_stmt.server) {
int flags = 0;
mfd_server_t srv;

Return to:

Send suggestions and report system problems to the System administrator.