aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2010-12-20 22:48:55 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2010-12-21 10:34:44 +0200
commite75c9a39fd65c73c22a2966de51c875109f78946 (patch)
tree97f83d357261961448b820c452d7a5eaa45f023e /src/main.c
parentc8007b6f1bc449154dcafaf7dc84bba188ef4fed (diff)
downloadmailfromd-e75c9a39fd65c73c22a2966de51c875109f78946.tar.gz
mailfromd-e75c9a39fd65c73c22a2966de51c875109f78946.tar.bz2
Switch to MU3 API.
* lib/debug.c: Remove. * lib/debug.h: Remove. * lib/Makefile.am (noinst_HEADERS): Remove debug.h (libmf_a_SOURCES): Remove debug.c * lib/appinit.c: Use new mu_stream_* calls. * lib/libmf.h (config_array_to_argv,config_array_to_string): Change signatures. (config_cb_timeout): Likewise. (logger)<log_print>: Remove. <log_open>: Change signature. (logger_open): Change signature. (vlogmsg,logmsg): Rewrite as macros. * lib/logger.c: Rewrite logging support using MU3 streams. * lib/utils.c (config_array_to_argv) (config_array_to_string, config_cb_timeout): Rewrite. * lib/server.c (mf_server_start): Call mu_onexit_run. * lib/version.c (version_etc_copyright): Rename to avoid name clash. * lib/dbcfg.c: Rewrite callbacks. Use MU3 configuration framework. * lib/cache.c: Use mu_debug for debugging. * lib/db.c: Likewise. * lib/dns.c: Likewise. * lib/greylist.c: Likewise. * lib/mf-dbm.c: Likewise. * lib/rate.c: Likewise. * lib/srvman.c: Likewise. * lib/tbf_rate.c: Likewise. * src/builtin/snarf.m4: Likewise. * src/calloutd.c: Likewise. * src/engine.c: Likewise. * src/spf.c: Likewise. * src/Makefile.am (mfd-dbgmod.h): Offset the indices by the value of mfd_debug_handle. * src/builtin/body.bi (current_message): Use mu_stream_to_message. * src/builtin/curhdr.bi: Use MU3 API. * src/builtin/db.bi: Likewise. * src/builtin/io.bi: Likewise. * src/builtin/mail.bi: Likewise. * src/builtin/msg.bi: Likewise. * src/builtin/mudebug.bi: Likewise. * src/builtin/sieve.bi: Likewise. * src/lex.l: Likewise. * src/savsrv.c: Likewise. * src/srvcfg.c: Likewise. * src/builtin/other.bi (debug_level): Rewrite using mu_debug_category_level (debug_spec): Rewrite using mu_debug_format_spec. (debug): Rewrite using mu_debug_parse_spec. * src/callout.c (smtp_io_data) <send_off, recv_off>: Remove. All uses updated. (smtp_io_free, smtp_send, smtp_recvline) (smtp_io_close, callout_host, callout_mx) (libcallout_init): Use new stream and debugging API. * src/mailfromd.h (mfd_debug_handle): New extern. (add_legacy_milter_port): Change signature. * src/main.c (mf_strecho): New global. (mfd_gacopyz_log_printer): Remove. (read_domain_file): Change signature. (cb_milter_timeout, cb_timeout, cb_set_variable) (cb_include_path, cb_trace_program, cb_relayed_domain_file): Rewrite. (mfd_debug_handle): New variable. (open_strecho): New function. (main): Revise logging support initialization. * src/mfdbtool.c: Use new MU API. * src/pp.c: Likewise. * src/pragma.c: Likewise. * src/prog.c: Use new MU API. (instr_echo): Send output to mf_strecho. * src/prog.h (mf_strecho): New extern. * src/builtin/msg.h (mf_message) <mstr, bstr>: New members. * src/builtin/sa.bi: Rewrite using new stream functions. * pmult/.gitignore: Remove pdbg.h. * pmult/pdbg.hm4: Remove. * pmult/debugdef.m4: Remove. * pmult/Makefile.am (EXTRA_DIST): Remove pdbg.hm4 and debugdef.m4 (pmult_SOURCES): Remove pdbg.h * pmult/pmult.c: Redo logging, debugging and configuration support. * tests/hdr-gete.at: Update. * tests/testsuite.at (AT_MTA_TEST): Filter out info prefix from the 'echo' output.
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c180
1 files changed, 100 insertions, 80 deletions
diff --git a/src/main.c b/src/main.c
index 8ce17324..98440ff6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -77,12 +77,14 @@ int stack_trace_option; /* Print stack traces on runtime errors */
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
add_pp_option(const char *opt, const char *arg)
{
size_t len;
@@ -107,58 +109,35 @@ 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);
}
}
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);
}
}
@@ -166,22 +145,22 @@ log_status(sfsistat status, SMFICTX *ctx)
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];
char *p;
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;
}
if (!domain_list) {
mu_list_create(&domain_list);
mu_list_set_comparator(domain_list, mf_list_compare_string);
@@ -214,14 +193,14 @@ int
relayed_domain_p(char *name)
{
char *p = 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, '.');
if (p)
p++;
}
@@ -258,13 +237,13 @@ 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;
}
static void
set_relay(void *value)
{
@@ -701,149 +680,143 @@ 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);
}
return 0;
}
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) {
case MU_CFG_STRING:
value = arg->v.arg.v[1].v.string;
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();
}
defer_initialize_variable(arg->v.arg.v[0].v.string, value);
free(alloc_str);
return 0;
}
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);
}
break;
case MU_CFG_LIST:
mu_list_get_iterator(val->v.list, &itr);
for (mu_iterator_first(itr);
!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);
}
mu_iterator_destroy(&itr);
}
return rc;
}
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;
switch (val->type) {
case MU_CFG_STRING:
enable_prog_trace(val->v.string);
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;
enable_prog_trace(val->v.arg.v[i].v.string);
}
break;
case MU_CFG_LIST:
@@ -851,26 +824,25 @@ cb_trace_program(mu_debug_t err, void *data, mu_config_value_t *val)
break;
}
return rc;
}
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;
}
struct mu_cfg_param mf_cfg_param[] = {
@@ -1074,12 +1046,24 @@ static char *modnames[] = {
#define __DBGMOD_C_ARRAY
# include "mfd-dbgmod.h"
#undef __DBGMOD_C_ARRAY
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)
{
if (!key || strcmp(key, "default") == 0 || strcmp(key, "milter") == 0)
cfg->server = milter_session_server;
@@ -1090,13 +1074,44 @@ mf_server_function(const char *key, struct mf_srvcfg *cfg)
callout_server_url =
xstrdup(mu_url_to_string(cfg->url));
} else
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;
int
main(int argc, char **argv)
{
@@ -1114,16 +1129,17 @@ main(int argc, char **argv)
if (!program_invocation_short_name)
program_invocation_short_name = argv[0];
argp_program_version_hook = version;
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();
init_string_space();
init_symbols();
builtin_setup();
@@ -1147,12 +1163,13 @@ main(int argc, char **argv)
rc = mfd_app_init(&argp, capa, mf_cfg_param, argc, argv,
argpflag(argc, argv), &index, &args, NULL);
if (rc)
exit(EX_CONFIG);
flush_arguments(&args);
mf_srvcfg_flush();
+ mf_server_log_setup();
alloc_ext_pp();
argv += index;
argc -= index;
@@ -1260,25 +1277,28 @@ main(int argc, char **argv)
if (script_file[0] != '/') {
mu_diag_output(MU_DIAG_WARNING,
_("script file is given "
"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;
case MAILFROMD_SHOW_DEFAULTS:
mailfromd_show_defaults();
break;
case MAILFROMD_RUN:
+ open_strecho(0);
mailfromd_run(entry_point, argc, argv);
}
exit(EX_OK);
}

Return to:

Send suggestions and report system problems to the System administrator.