diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 180 |
1 files changed, 100 insertions, 80 deletions
@@ -80,6 +80,8 @@ size_t max_match_mx = MAXMXCOUNT; char *main_function_name = "main"; char *callout_server_url; +mu_stream_t mf_strecho; /* Output stream for 'echo' statements */ + /* Preprocessor helper function */ static void @@ -110,36 +112,12 @@ pp_define(const char *symbol) /* Logging & debugging */ void -mfd_gacopyz_log_printer(int level, char *fmt, va_list ap) -{ - switch (level) { - case SMI_LOG_DEBUG: - level = LOG_DEBUG; - break; - case SMI_LOG_INFO: - level = LOG_INFO; - break; - case SMI_LOG_WARN: - level = LOG_WARNING; - break; - case SMI_LOG_ERR: - level = LOG_ERR; - break; - - case SMI_LOG_FATAL: - default: - level = LOG_EMERG; - } - vlogmsg(level, fmt, ap); -} - -void trace(const char *fmt, ...) { if (do_trace) { va_list ap; va_start(ap, fmt); - vlogmsg(LOG_INFO, fmt, ap); + vlogmsg(MU_LOG_INFO, fmt, ap); va_end(ap); } } @@ -148,14 +126,15 @@ void log_status(sfsistat status, SMFICTX *ctx) { int lev; - debug_module_level(NULL, &lev); - if (lev >= 1 && status != SMFIS_CONTINUE) { + mu_debug_category_level(NULL, 0, &lev); + if ((lev & ~MU_DEBUG_LEVEL_MASK(MU_DEBUG_ERROR)) && + status != SMFIS_CONTINUE) { const char *str = sfsistat_str(status); if (str) - logmsg(LOG_INFO, + logmsg(MU_LOG_INFO, "%s%s", mailfromd_msgid(ctx), str); else - logmsg(LOG_INFO, + logmsg(MU_LOG_INFO, "%sstatus %d", mailfromd_msgid(ctx), status); } @@ -169,7 +148,7 @@ static mu_list_t domain_list; /* Read domains from sendmail-style domain file NAME and store them in DOMAIN_LIST */ int -read_domain_file(mu_debug_t err, const char *name) +read_domain_file(const char *name) { FILE *fp; char buf[256]; @@ -177,8 +156,8 @@ read_domain_file(mu_debug_t err, const char *name) fp = fopen(name, "r"); if (!fp) { - mf_error_on_locus(err, _("cannot open file `%s': %s"), - name, mu_strerror(errno)); + mu_error(_("cannot open file `%s': %s"), + name, mu_strerror(errno)); return 1; } @@ -217,8 +196,8 @@ relayed_domain_p(char *name) while (p) { if (mu_list_locate(domain_list, p, NULL) == 0) { - debug(MF_SOURCE_MAIN, 10, - ("%s is in relayed domain %s", name, p)); + mu_debug(MF_SOURCE_MAIN, MU_DEBUG_TRACE5, + ("%s is in relayed domain %s", name, p)); return 1; } p = strchr(p, '.'); @@ -261,7 +240,7 @@ set_milter_timeout(void *value) static int load_relay_file(void *item, void *data) { - read_domain_file((mu_debug_t) data, item); + read_domain_file(item); return 0; } @@ -704,17 +683,16 @@ static struct argp argp = { /* Mailutils-2.0 configuration */ static int -cb_milter_timeout(mu_debug_t err, void *data, mu_config_value_t *arg) +cb_milter_timeout(void *data, mu_config_value_t *arg) { struct timeval tv; - int rc = config_cb_timeout (&tv, err, arg); + int rc = config_cb_timeout (&tv, arg); if (rc) return 1; if (smfi_settimeout(tv.tv_sec) == MI_FAILURE) { - mf_error_on_locus(err, - _("Invalid milter timeout: %lu"), - (unsigned long) tv.tv_sec); + mu_error(_("Invalid milter timeout: %lu"), + (unsigned long) tv.tv_sec); exit(EX_USAGE); } @@ -722,32 +700,32 @@ cb_milter_timeout(mu_debug_t err, void *data, mu_config_value_t *arg) } static int -cb_timeout(mu_debug_t err, void *data, mu_config_value_t *arg) +cb_timeout(void *data, mu_config_value_t *arg) { struct timeval tv; - int rc = config_cb_timeout (&tv, err, arg); + int rc = config_cb_timeout (&tv, arg); if (rc == 0) *(time_t*) data = tv.tv_sec; return rc; } static int -cb_set_variable(mu_debug_t err, void *data, mu_config_value_t *arg) +cb_set_variable(void *data, mu_config_value_t *arg) { const char *value; char *alloc_str = NULL; - if (mu_cfg_assert_value_type(arg, MU_CFG_ARRAY, err)) + if (mu_cfg_assert_value_type(arg, MU_CFG_ARRAY)) return 1; if (arg->v.arg.c < 2) { - mf_error_on_locus(err, _("not enough arguments")); + mu_error(_("not enough arguments")); return 1; } else if (arg->v.arg.c > 2) { - mf_error_on_locus(err, _("too many arguments")); + mu_error(_("too many arguments")); return 1; } - if (mu_cfg_assert_value_type(&arg->v.arg.v[0], MU_CFG_ARRAY, err)) + if (mu_cfg_assert_value_type(&arg->v.arg.v[0], MU_CFG_ARRAY)) return 1; switch (arg->v.arg.v[1].type) { @@ -756,18 +734,17 @@ cb_set_variable(mu_debug_t err, void *data, mu_config_value_t *arg) break; case MU_CFG_ARRAY: - alloc_str = config_array_to_string(&arg->v.arg.v[1], err); + alloc_str = config_array_to_string(&arg->v.arg.v[1]); value = alloc_str; break; case MU_CFG_LIST: - mu_cfg_format_error(err, MU_DEBUG_ERROR, _("unexpected list")); + mu_error(_("unexpected list")); return 1; default: - mu_cfg_format_error (err, MU_DEBUG_ERROR, - _("INTERNAL ERROR at %s:%d: please report"), - __FILE__, __LINE__); + mu_error (_("INTERNAL ERROR at %s:%d: please report"), + __FILE__, __LINE__); abort(); } @@ -777,33 +754,31 @@ cb_set_variable(mu_debug_t err, void *data, mu_config_value_t *arg) } static int -cb_include_path(mu_debug_t err, void *data, mu_config_value_t *val) +cb_include_path(void *data, mu_config_value_t *val) { int i, rc = 0; - int argc; - char **argv; + struct mu_wordsplit ws; mu_iterator_t itr; switch (val->type) { case MU_CFG_STRING: - rc = mu_argcv_get_np(val->v.string, strlen(val->v.string), - ":", NULL, 0, &argc, &argv, NULL); - if (rc) { - mu_cfg_format_error(err, MU_DEBUG_ERROR, - "mu_argcv_get: %s", - mu_strerror(rc)); + ws.ws_delim = ":"; + if (mu_wordsplit(val->v.string, &ws, + MU_WRDSF_NOVAR | + MU_WRDSF_NOCMD | MU_WRDSF_DELIM)) { + mu_error("mu_wordsplit: %s", + mu_wordsplit_strerror(&ws)); return 1; } - for (i = 0; i < argc; i++) - add_include_dir(argv[i]); - mu_argcv_free(argc, argv); + for (i = 0; i < ws.ws_wordc; i++) + add_include_dir(ws.ws_wordv[i]); + mu_wordsplit_free(&ws); break; case MU_CFG_ARRAY: for (i = 0; i < val->v.arg.c; i++) { if (mu_cfg_assert_value_type(&val->v.arg.v[i], - MU_CFG_STRING, - err)) + MU_CFG_STRING)) return 1; add_include_dir(val->v.arg.v[i].v.string); } @@ -815,8 +790,7 @@ cb_include_path(mu_debug_t err, void *data, mu_config_value_t *val) !mu_iterator_is_done(itr); mu_iterator_next(itr)) { mu_config_value_t *pval; mu_iterator_current(itr, (void*) &pval); - rc = mu_cfg_assert_value_type(pval, MU_CFG_STRING, - err); + rc = mu_cfg_assert_value_type(pval, MU_CFG_STRING); if (rc) break; add_include_dir(pval->v.string); @@ -827,7 +801,7 @@ cb_include_path(mu_debug_t err, void *data, mu_config_value_t *val) } static int -cb_trace_program(mu_debug_t err, void *data, mu_config_value_t *val) +cb_trace_program(void *data, mu_config_value_t *val) { int i, rc = 0; @@ -839,8 +813,7 @@ cb_trace_program(mu_debug_t err, void *data, mu_config_value_t *val) case MU_CFG_ARRAY: for (i = 0; i < val->v.arg.c; i++) { if (mu_cfg_assert_value_type(&val->v.arg.v[i], - MU_CFG_STRING, - err)) + MU_CFG_STRING)) return 1; enable_prog_trace(val->v.arg.v[i].v.string); } @@ -854,20 +827,19 @@ cb_trace_program(mu_debug_t err, void *data, mu_config_value_t *val) } static int -cb_relayed_domain_file(mu_debug_t err, void *data, mu_config_value_t *val) +cb_relayed_domain_file(void *data, mu_config_value_t *val) { switch (val->type) { case MU_CFG_STRING: - read_domain_file(err, val->v.string); + read_domain_file(val->v.string); break; case MU_CFG_LIST: - mu_list_do(val->v.list, load_relay_file, err); + mu_list_do(val->v.list, load_relay_file, NULL); break; default: - mu_cfg_format_error (err, MU_DEBUG_ERROR, - _("expected string or list of strings")); + mu_error (_("expected string or list of strings")); } return 0; } @@ -1077,6 +1049,18 @@ static char *modnames[] = { NULL }; +size_t mfd_debug_handle; + +static void +debug_init() +{ + int i; + + mfd_debug_handle = mu_debug_register_category (modnames[0]); + for (i = 1; modnames[i]; i++) + mu_debug_register_category (modnames[i]); +} + int mf_server_function(const char *key, struct mf_srvcfg *cfg) @@ -1093,7 +1077,38 @@ mf_server_function(const char *key, struct mf_srvcfg *cfg) return 1; return 0; } - + +static void +open_strecho (int daemon_mode) +{ + int rc; + if (daemon_mode) { + rc = mu_stream_ioctl(mu_strerr, MU_IOCTL_LOGSTREAM, + MU_IOCTL_LOGSTREAM_CLONE, + &mf_strecho); + if (rc == 0) { + int s = MU_LOG_INFO; + mu_stream_ioctl(mf_strecho, MU_IOCTL_LOGSTREAM, + MU_IOCTL_LOGSTREAM_SET_SEVERITY, + &s); + } + } else { +#if 0 + mf_strecho = mu_strout; + mu_stream_ref(mf_strecho); + rc = 0; +#else + rc = mu_stdio_stream_create (&mf_strecho, MU_STDERR_FD, 0); +#endif + } + if (rc) { + mu_diag_output (MU_LOG_CRIT, + _("cannot create echo output stream: %s"), + mu_strerror (rc)); + exit (EX_UNAVAILABLE); + } +} + extern char **environ; @@ -1117,10 +1132,11 @@ main(int argc, char **argv) yy_flex_debug = 0; /* Set default logging */ + mu_set_program_name (argv[0]); + mu_log_tag = (char*)mu_program_name; mu_log_facility = DEFAULT_LOG_FACILITY; - gacopyz_set_logger(mfd_gacopyz_log_printer); - mf_srvcfg_log_setup(MU_LOG_TAG(), - stderr_closed_p() ? "syslog" : "stderr"); + mu_stdstream_setup (); + mf_srvcfg_log_setup(stderr_closed_p() ? "syslog" : "stderr"); debug_init(modnames); libcallout_init(); @@ -1150,6 +1166,7 @@ main(int argc, char **argv) exit(EX_CONFIG); flush_arguments(&args); mf_srvcfg_flush(); + mf_server_log_setup(); alloc_ext_pp(); @@ -1263,11 +1280,13 @@ main(int argc, char **argv) "without full file name")); server_flags |= MF_SERVER_NORESTART; } + open_strecho(1); mf_server_start("mailfromd", mailfromd_state_dir, pidfile, server_flags); break; case MAILFROMD_TEST: + open_strecho(0); mailfromd_test(argc, argv); break; @@ -1276,6 +1295,7 @@ main(int argc, char **argv) break; case MAILFROMD_RUN: + open_strecho(0); mailfromd_run(entry_point, argc, argv); } |