diff options
Diffstat (limited to 'mfd/main.c')
-rw-r--r-- | mfd/main.c | 55 |
1 files changed, 47 insertions, 8 deletions
@@ -72,5 +72,5 @@ unsigned optimization_level = 1; /* Optimization level */ int log_to_stderr; /* Use stderr for logging */ -int force_remove = 1; /* Remove local communication socket if it already - exists */ int foreground; /* Stay in foreground */ +int force_remove; /* Remove local communication socket if it already + exists */ int single_process_option; /* Run in single process mode. */ @@ -624,3 +624,4 @@ add_legacy_milter_port(const char *str, mu_debug_t dbg) mfd_server_t srv = mfd_server_new(id, url, - milter_session_server); + milter_session_server, + 0); if (srv) @@ -1383,3 +1384,2 @@ parse_opt(int key, char *arg, struct argp_state *state) case 'r': - /*FIXME*/ force_remove = 1; @@ -2101,2 +2101,4 @@ struct server_config_stmt { mfd_server_func_t server; + int single_process; + int reuseaddr; }; @@ -2128,2 +2130,8 @@ struct mu_cfg_param server_section_param[] = { N_("Maximum number of instances allowed for this server.") }, + { "single-process", mu_cfg_bool, + &server_config_stmt.single_process, 0, NULL, + N_("Single-process mode.") }, + { "reuseaddr", mu_cfg_bool, + &server_config_stmt.reuseaddr, 0, NULL, + N_("Reuse existing socket (default).") }, { "acl", mu_cfg_section, @@ -2143,2 +2151,3 @@ server_section_parser(enum mu_cfg_section_stage stage, 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, @@ -2162,6 +2171,13 @@ server_section_parser(enum mu_cfg_section_stage stage, if (server_config_stmt.url && server_config_stmt.server) { - mfd_server_t srv = - mfd_server_new(server_config_stmt.id, - server_config_stmt.url, - server_config_stmt.server); + int flags = 0; + mfd_server_t srv; + + if (server_config_stmt.single_process) + flags |= SRV_SINGLE_PROCESS; + if (!server_config_stmt.reuseaddr) + flags |= SRV_KEEP_EXISTING; + srv = mfd_server_new(server_config_stmt.id, + server_config_stmt.url, + server_config_stmt.server, + flags); if (srv) { @@ -2204,2 +2220,18 @@ cb_milter_listen(mu_debug_t err, void *data, mu_config_value_t *arg) +static int +cb_callout_url(mu_debug_t err, void *data, mu_config_value_t *arg) +{ + mu_url_t url; + if (mu_cfg_assert_value_type(arg, MU_CFG_STRING, err)) + return 1; + url = parse_milter_url(err, arg->v.string); + if (url) { + callout_server_sa = srvman_url_to_sockaddr(url, + &callout_server_sa_len); + mu_url_destroy(&url); + } + return 0; +} + + struct mu_cfg_param mf_cfg_param[] = { @@ -2294,2 +2326,9 @@ struct mu_cfg_param mf_cfg_param[] = { { "database", mu_cfg_section, NULL }, + + { "callout-url", mu_cfg_callback, + NULL, 0, + cb_callout_url, + N_("URL of the callout server"), + N_("url") }, + |