diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-11-21 23:13:13 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-11-21 23:13:13 +0200 |
commit | 7f4dfb88f23a14f0b9603e648d4a1a459a6f26a3 (patch) | |
tree | 2beb9dee6a3a93130bd7f783a62afa20ed14e853 /mfd/main.c | |
parent | d20b648b02aa1f8caf9975a116c54e05d67d1c39 (diff) | |
download | mailfromd-mtax-cleanup.tar.gz mailfromd-mtax-cleanup.tar.bz2 |
Use callout resolver to handle timed-out callouts.mtax-cleanup
* mfd/savclt.c: New file.
* mfd/Makefile.am (mailfromd_SOURCES): Add savclt.c
* mfd/callout.c (transcript): Get ID as 1st arg.
Remove static qualifier. All callers updated.
* mfd/engine.c (method_strict)
(method_standard): If callout returned mf_temp_failure,
try to pass the task to the callout server, if one is
defined.
* mfd/mailfromd.h (transcript)
(schedule_callout): New protos.
(callout_server_sa, callout_server_sa_len): New externs.
* mfd/main.c (force_remove): Initialize to 0 (see srvman.c)
(server_config_stmt): New statements single-process and
reuseaddr.
(add_legacy_milter_port, server_section_parser): Pass
flags to mfd_server_new.
(mf_cfg_param): New statement `callout-url'.
* mfd/savsrv.c (MF_SOURCE_NAME): Fixed.
(verify, callout_session_server): Set proctitle.
(callout_session_server): Fix memory leak.
* mfd/srvman.c (struct mfd_server): New member `flags'.
(mfd_server_new): Take flags as 4th argument.
(server_run): Use flags to set single-user and reuseaddr
modes.
* mfd/srvman.h (SRV_SINGLE_PROCESS)
(SRV_KEEP_EXISTING): New defines.
(mfd_server_new): Change signature.
(srvman_url_to_sockaddr): New proto.
Diffstat (limited to 'mfd/main.c')
-rw-r--r-- | mfd/main.c | 55 |
1 files changed, 47 insertions, 8 deletions
@@ -70,9 +70,9 @@ int do_trace; /* Enable tracing configuration */ int mtasim_option; /* mtasim compatibility mode */ 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. */ unsigned long source_address = INADDR_ANY; /* Source address for TCP connections */ @@ -622,7 +622,8 @@ add_legacy_milter_port(const char *str, mu_debug_t dbg) url = parse_milter_url(dbg, str); if (url) { mfd_server_t srv = mfd_server_new(id, url, - milter_session_server); + milter_session_server, + 0); if (srv) mfd_srvman_attach_server(srv); else @@ -1381,7 +1382,6 @@ parse_opt(int key, char *arg, struct argp_state *state) break; case 'r': - /*FIXME*/ force_remove = 1; break; @@ -2099,6 +2099,8 @@ struct server_config_stmt { 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; @@ -2126,6 +2128,12 @@ struct mu_cfg_param server_section_param[] = { &server_config_stmt.max_children, 0, NULL, 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, &server_config_stmt.acl }, { NULL } @@ -2141,6 +2149,7 @@ server_section_parser(enum mu_cfg_section_stage stage, 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)) return 1; @@ -2160,10 +2169,17 @@ server_section_parser(enum mu_cfg_section_stage stage, if (!server_config_stmt.id) server_config_stmt.id = next_server_id(); 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) { mfd_server_set_max_children(srv, server_config_stmt.max_children); @@ -2202,6 +2218,22 @@ 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[] = { { "debug", mu_cfg_callback, NULL, 0, cb_debug, N_("Set Mailfromd debug verbosity level. Argument is a comma-" @@ -2292,6 +2324,13 @@ struct mu_cfg_param mf_cfg_param[] = { N_("file: string") }, { "database", mu_cfg_section, NULL }, + + { "callout-url", mu_cfg_callback, + NULL, 0, + cb_callout_url, + N_("URL of the callout server"), + N_("url") }, + { NULL } }; |