diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-08-22 22:21:28 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-08-22 23:11:41 +0300 |
commit | dc8d3d50cbaca39447576ac0ac573ca8a84a2c05 (patch) | |
tree | d9a4f88f0fb0019a740d334d67a7215d66c0c8aa | |
parent | 84db5d2111b2f8ac9fd583ed13c106b620b8fefa (diff) | |
download | mailfromd-dc8d3d50cbaca39447576ac0ac573ca8a84a2c05.tar.gz mailfromd-dc8d3d50cbaca39447576ac0ac573ca8a84a2c05.tar.bz2 |
Fix starting of the default callout server. Reflect the actual server URL in callout_server_url.
* mflib/callout.mf4 (callout_server_url): New variable.
(begin): Provide a default for callout_server_url.
(__callout_open_default): Return the fd.
(callout): Use return from __callout_open_default as
the first argument to callout_do.
* mflib/poll.mf (__make_extra_arg): New static function.
(_pollhost, _pollmx, stdpoll, strictpoll): Use return from
__callout_open_default as the first argument to callout_do.
Construct the rest of arguments using __make_extra_arg.
* src/builtin/callout.bi (callout_server_url): Remove.
(default_callout_server_url): New function.
(MF_INIT): Remove initialization of callout_server_url.
* src/mailfromd.h (default_callout_url): Rename to
callout_server_url.
* src/main.c (default_callout_url): Rename to
callout_server_url.
(provide_default_callout_server): Rewrite the condition.
Don't try to reset the callout_server_url MFL variable: it
is useless after compilation is finished.
(mf_server_function): Fix the use of mu_list_locate.
(main): Fix a typo in the server section label.
* src/srvcfg.c (server_section_parser): Move the call to
mf_server_function to the mu_cfg_section_end branch.
-rw-r--r-- | mflib/callout.mf4 | 13 | ||||
-rw-r--r-- | mflib/poll.mf | 31 | ||||
-rw-r--r-- | src/builtin/callout.bi | 9 | ||||
-rw-r--r-- | src/mailfromd.h | 2 | ||||
-rw-r--r-- | src/main.c | 22 | ||||
-rw-r--r-- | src/srvcfg.c | 10 |
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, @@ -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; |