diff options
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | lib/filenames.h | 1 | ||||
-rw-r--r-- | lib/logger.c | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/calloutd.c | 33 | ||||
-rw-r--r-- | src/engine.c | 23 | ||||
-rw-r--r-- | src/lex.l | 9 | ||||
-rw-r--r-- | src/mailfromd.h | 3 | ||||
-rw-r--r-- | src/main.c | 55 | ||||
-rw-r--r-- | src/savsrv.c | 27 | ||||
-rw-r--r-- | src/srvcfg.c | 99 | ||||
-rw-r--r-- | src/srvcfg.h | 3 |
12 files changed, 144 insertions, 114 deletions
@@ -1,5 +1,6 @@ Mailfromd TODO list. +Restore syslog-async and lock-retry-timeout statements * Language: ** Implement \U, \L, \E and other GNU extensions to the replacement strings. diff --git a/lib/filenames.h b/lib/filenames.h index 6deae3d1..3810cf6f 100644 --- a/lib/filenames.h +++ b/lib/filenames.h @@ -15,7 +15,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* Default file names */ -#define DEFAULT_PIDFILE "mailfromd.pid" #define DEFAULT_CALLOUT_SOCKET "callout" #define DEFAULT_DATABASE "mailfromd.db" #define DEFAULT_RATE_DATABASE "rates.db" diff --git a/lib/logger.c b/lib/logger.c index 56ab3c10..e8455bc0 100644 --- a/lib/logger.c +++ b/lib/logger.c @@ -184,7 +184,7 @@ static struct logger loggertab[] = { syslog_async_open, syslog_async_close, syslog_async_printer, - NULL }, + syslog_async_fdset }, #endif { NULL } }; diff --git a/src/Makefile.am b/src/Makefile.am index f1ccf972..dd853b64 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -160,7 +160,7 @@ optab.c optab.h: opcodes mfd-dbgmod.h: Makefile.am $(AM_V_GEN) sed -n 's/.*debug *(MF_SOURCE_\([^,]*\),.*/\1/p' \ - $(mailfromd_SOURCES) $(libcallout_a_SOURCES) | sort | uniq | \ + $(mailfromd_SOURCES) | sort | uniq | \ awk -f $(top_srcdir)/src/dbgmod.awk > mfd-dbgmod.h callout-dbgmod.h: Makefile.am diff --git a/src/calloutd.c b/src/calloutd.c index df14c0b2..1b167585 100644 --- a/src/calloutd.c +++ b/src/calloutd.c @@ -56,34 +56,6 @@ version(FILE *stream, struct argp_state *state) } -static void -_log_setup(const char *tag, char *stream) -{ - mu_debug_t debug; - - mu_diag_get_debug (&debug); - - if (logger_select(stream)) { - mu_error(_("unsupported logger stream: %s"), stream); - exit(EX_USAGE); - } - logger_open(tag, LOG_PID, mu_log_facility); - - /* FIXME */ - if (strcmp(stream, "stderr") == 0) { - mu_debug_default_printer = mu_debug_stderr_printer; - } else { - mu_debug_default_printer = mu_debug_syslog_printer; - } -} - -void -mf_server_log_setup(void) -{ - _log_setup(syslog_tag, log_stream); -} - - const char *program_version = "calloutd (" PACKAGE_STRING ")"; static char doc[] = N_("calloutd -- a call out server"); static char args_doc[] = ""; @@ -149,7 +121,8 @@ main(int argc, char **argv) argp_program_version_hook = version; /* Set default logging */ mu_log_facility = DEFAULT_LOG_FACILITY; - _log_setup(MU_LOG_TAG(), stderr_closed_p() ? "syslog" : "stderr"); + mf_srvcfg_log_setup(MU_LOG_TAG(), + stderr_closed_p() ? "syslog" : "stderr"); libcallout_init(); libdbm_init(); @@ -159,7 +132,7 @@ main(int argc, char **argv) database_cfg_init(); mu_acl_cfg_init(); srvman_init(); - mf_srvcfg_init(NULL); + mf_srvcfg_init(argv[0], NULL); mu_argp_init(program_version, "<" PACKAGE_BUGREPORT ">"); mu_app_rcfile = SYSCONFDIR "/calloutd.conf";//FIXME diff --git a/src/engine.c b/src/engine.c index 5cbfa3a8..7e455fef 100644 --- a/src/engine.c +++ b/src/engine.c @@ -749,10 +749,8 @@ static struct smfiDesc smfilter = /* Milter server functions */ -int -milter_session_server(const char *id, int fd, - struct sockaddr const *sa, socklen_t len, - void *server_data, void *srvman_data) +static void +setprocid(const char *id) { char *tag; @@ -763,12 +761,29 @@ milter_session_server(const char *id, int fd, strcat(tag, id); syslog_tag = tag; mf_server_log_setup(); +} +int +milter_session_server(const char *id, int fd, + struct sockaddr const *sa, socklen_t len, + void *server_data, void *srvman_data) +{ + setprocid(id); gacopyz_context_loop(fd, &smfilter, (milter_sockaddr_t*) sa, len, (void*) id); return 0; } +int +mfd_callout_session_server(const char *id, int fd, + struct sockaddr const *sa, socklen_t len, + void *server_data, void *srvman_data) +{ + setprocid(id); + return callout_session_server(id, fd, sa, len, + server_data, srvman_data); +} + void milter_setlogmask(int mask) { @@ -155,13 +155,12 @@ static int lex_new_source_0(const char *name) { if (ext_pp) { - char *ppcmd; - yyin = pp_extrn_start(name, &pp_pid); if (!yyin) { - parse_error(_("unable to start external preprocessor `%s': %s"), - ppcmd, - mu_strerror(errno)); + parse_error(_("unable to start external " + "preprocessor `%s': %s"), + ext_pp, + mu_strerror(errno)); return EX_OSFILE; } } else { diff --git a/src/mailfromd.h b/src/mailfromd.h index 37aa1c83..6990d5b0 100644 --- a/src/mailfromd.h +++ b/src/mailfromd.h @@ -898,6 +898,9 @@ int milter_session_server(const char *id, int fd, struct sockaddr const *sa, socklen_t len, void *server_data, void *srvman_data); +int mfd_callout_session_server(const char *id, int fd, + struct sockaddr const *sa, socklen_t len, + void *server_data, void *srvman_data); void milter_setlogmask(int mask); void milter_settimeout(time_t t); @@ -133,19 +133,6 @@ mfd_gacopyz_log_printer(int level, char *fmt, va_list ap) vlogmsg(level, fmt, ap); } -int -mf_diag_syslog_printer (void *data, mu_log_level_t level, const char *buf) -{ - int len = strlen (buf); - if (len > 0 && buf[len-1] == '\n') { - len--; - if (len > 0 && buf[len-1] == '\r') - len--; - } - logmsg(mu_diag_level_to_syslog(level), "%-.*s", len, buf); - return 0; -} - void trace(const char *fmt, ...) { @@ -1034,35 +1021,6 @@ mailfromd_show_defaults() } static void -_log_setup(const char *tag, char *stream) -{ - mu_debug_t debug; - - mu_diag_get_debug (&debug); - - if (logger_select(stream)) { - mu_error(_("unsupported logger stream: %s"), stream); - exit(EX_USAGE); - } - logger_open(tag, LOG_PID, mu_log_facility); - gacopyz_set_logger(mfd_gacopyz_log_printer); - - /* FIXME */ - if (strcmp(stream, "stderr") == 0) { - mu_debug_default_printer = mu_debug_stderr_printer; - } else { - mu_debug_set_print (debug, mf_diag_syslog_printer, NULL); - mu_debug_default_printer = mu_debug_syslog_printer; - } -} - -void -mf_server_log_setup(void) -{ - _log_setup(syslog_tag, log_stream); -} - -static void version(FILE *stream, struct argp_state *state) { mailfromd_version("mailfromd", stream); @@ -1126,7 +1084,7 @@ 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; + cfg->server = mfd_callout_session_server; if (cfg->defopt || mu_list_locate(cfg->options, "default", NULL) == 0) callout_server_url = @@ -1160,7 +1118,9 @@ main(int argc, char **argv) /* Set default logging */ mu_log_facility = DEFAULT_LOG_FACILITY; - _log_setup(MU_LOG_TAG(), stderr_closed_p() ? "syslog" : "stderr"); + gacopyz_set_logger(mfd_gacopyz_log_printer); + mf_srvcfg_log_setup(MU_LOG_TAG(), + stderr_closed_p() ? "syslog" : "stderr"); debug_init(modnames); libcallout_init(); @@ -1178,7 +1138,7 @@ main(int argc, char **argv) mu_acl_cfg_init(); database_cfg_init(); srvman_init(); - mf_srvcfg_init(N_("(milter | callout)")); + mf_srvcfg_init(argv[0], N_("(milter | callout)")); mu_argp_init(program_version, "<" PACKAGE_BUGREPORT ">"); mu_app_rcfile = DEFAULT_CONFIG_FILE; @@ -1236,11 +1196,6 @@ main(int argc, char **argv) fixup_create_script(); - /* Make sure syslog_tag is properly set */ - /* FIXME: Move this to logger.c? */ - if (!syslog_tag) - syslog_tag = (char*) MU_LOG_TAG(); - if (script_dump_tree) print_syntax_tree(); if (script_dump_code) diff --git a/src/savsrv.c b/src/savsrv.c index 397dfa5b..615f14e2 100644 --- a/src/savsrv.c +++ b/src/savsrv.c @@ -21,6 +21,7 @@ #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> +#include <signal.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> @@ -58,10 +59,17 @@ enum callout_mode { cmode_host_first }; +enum vrfy_state { + vrfy_queued, + vrfy_checked, + vrfy_cached +}; + struct vrfy_queue { struct vrfy_queue *next; unsigned serial; enum callout_mode mode; + enum vrfy_state state; char *hostname; smtp_io_t io; mf_status result; @@ -168,6 +176,8 @@ verify(struct vrfy_queue *qp, int hard) if ((code) == mf_timeout) \ (code) = hard ? mf_not_found : mf_temp_failure; \ } while(0) +#define RUNNABLE(qp, rc) \ + ((rc) == mf_failure || (qp)->state == vrfy_cached) smtp_io_set_timeouts(qp->io, hard ? smtp_timeout_hard : smtp_timeout_soft); @@ -178,10 +188,11 @@ verify(struct vrfy_queue *qp, int hard) qp->serial, smtp_io_email(qp->io)); rc = cache_get(smtp_io_email(qp->io)); - if (!mf_resolved(rc) && rc != mf_temp_failure) { + if (!mf_resolved(rc) && RUNNABLE(qp, rc)) { rc = callout_standard(qp->io); STATUS_FIXUP(rc); cache_insert(smtp_io_email(qp->io), rc); + qp->state = vrfy_cached; } break; @@ -202,11 +213,12 @@ verify(struct vrfy_queue *qp, int hard) smtp_io_email(qp->io), qp->hostname); rc = cache_get2(smtp_io_email(qp->io), qp->hostname); - if (!mf_resolved(rc) && rc != mf_temp_failure) { + if (!mf_resolved(rc) && RUNNABLE(qp, rc)) { rc = callout_strict(qp->io, qp->hostname); STATUS_FIXUP(rc); cache_insert2(smtp_io_email(qp->io), qp->hostname, rc); + qp->state = vrfy_cached; } break; @@ -310,7 +322,7 @@ addq(int argc, char **argv, const char **errp) qp->serial = serial++; qp->result = mf_temp_failure; /* FIXME */ - + qp->state = vrfy_queued; qp->io = smtp_io_create(session_id ? session_id : email, smtp_timeout_hard, savsrv_smtp_io_callback, @@ -413,7 +425,9 @@ cmd_run(FILE *fp, int argc, char **argv) struct vrfy_queue *next = qp->next; writeout(fp, " %010u=%s", qp->serial, mf_status_str(qp->result)); - if (qp->result != mf_timeout) { + if (qp->state == vrfy_queued) + qp->state = vrfy_checked; + if (mf_resolved(qp->result)) { if (qp == tail) tail = prev; vrfy_free(qp); @@ -421,7 +435,7 @@ cmd_run(FILE *fp, int argc, char **argv) prev->next = next; else head = next; - } + } prev = qp; qp = next; } @@ -495,6 +509,9 @@ callout_session_server(const char *id, int fd, char *buf = NULL; size_t size = 0; + signal(SIGPIPE, SIG_IGN); + signal(SIGALRM, SIG_IGN); + defproctitle(); setvbuf(fp, NULL, _IOLBF, 0); diff --git a/src/srvcfg.c b/src/srvcfg.c index 135902b3..c96a125d 100644 --- a/src/srvcfg.c +++ b/src/srvcfg.c @@ -721,7 +721,7 @@ static struct argp_option srv_options[] = { N_("enable transcript of SMTP sessions"), GRP+1 }, { "debug", 'd', N_("LEVEL"), 0, N_("set debugging level"), GRP+1 }, - { "stderr", 's', NULL, 0, + { "stderr", OPTION_STDERR, NULL, 0, N_("log to stderr"), GRP+1 }, { "syslog", OPTION_SYSLOG, NULL, 0, N_("log to syslog (default)"), GRP+1 }, @@ -754,10 +754,6 @@ srv_parse_opt(int key, char *arg, struct argp_state *state) mf_optcache_set_option("source-ip", arg); break; - case 's': - log_stream = "stderr"; - break; - case 'u': mf_optcache_set_option("user", arg); break; @@ -795,11 +791,11 @@ srv_parse_opt(int key, char *arg, struct argp_state *state) break; case OPTION_SYSLOG: - log_stream = "syslog"; + mf_optcache_set_option("logger", "syslog"); break; case OPTION_STDERR: - log_stream = "stderr"; + mf_optcache_set_option("logger", "stderr"); break; default: @@ -826,8 +822,25 @@ srvcfg_gocs_init(enum mu_gocs_op op, void *data) return 0; } +#define PIDSUF ".pid" + +static void +setdefpidfilename(const char *progname) +{ + size_t len; + const char *base = strrchr(progname, '/'); + if (base) + base++; + else + base = progname; + len = strlen(base); + pidfile = xmalloc(len + sizeof(PIDSUF)); + memcpy(pidfile, base, len); + strcpy(pidfile + len, PIDSUF); +} + void -mf_srvcfg_init(const char *label) +mf_srvcfg_init(const char *progname, const char *label) { struct mu_cfg_section *section; @@ -835,7 +848,8 @@ mf_srvcfg_init(const char *label) server_stmt_init(label); mailfromd_state_dir = DEFAULT_STATE_DIR; - pidfile = DEFAULT_PIDFILE; + if (!pidfile) + setdefpidfilename(progname); mf_optcache_add(srv_option_cache, 0, MF_OCF_NULL|MF_OCF_STATIC); mu_gocs_register(".pm:server", srvcfg_gocs_init); @@ -875,13 +889,6 @@ mf_srvcfg_flush() if (transcript_option) smtp_transcript = transcript_option; - FD_ZERO(&srvman_param.keepfds); - logger_fdset(&srvman_param.keepfds); - if (logger_flags(LOGF_STDERR)) - /* Keep also stdout. - FIXME: Is it still needed? */ - FD_SET(1, &srvman_param.keepfds); - /* Fix unspecified timeouts */ for (i = 0; i < SMTP_NUM_TIMEOUT; i++) { if (smtp_timeout_soft[i] == 0) @@ -892,4 +899,64 @@ mf_srvcfg_flush() if (!ehlo_domain) init_ehlo_domain(); + if (!syslog_tag) + syslog_tag = (char*) MU_LOG_TAG(); +} + +int +mf_diag_syslog_printer (void *data, mu_log_level_t level, const char *buf) +{ + int len = strlen (buf); + if (len > 0 && buf[len-1] == '\n') { + len--; + if (len > 0 && buf[len-1] == '\r') + len--; + } + logmsg(mu_diag_level_to_syslog(level), "%-.*s", len, buf); + return 0; +} + +int +mf_debug_syslog_printer(void *unused, mu_log_level_t level, const char *str) +{ + logmsg((level == MU_DEBUG_ERROR) ? LOG_ERR : LOG_DEBUG, "%s", str); + return 0; +} + +void +mf_srvcfg_log_setup(const char *tag, char *stream) +{ + mu_debug_t debug; + + mu_diag_get_debug(&debug); + + if (logger_select(stream)) { + mu_error(_("unsupported logger stream: %s"), stream); + exit(EX_USAGE); + } + /* LOG_NDELAY ensures that the log descriptor is ready. + It is needed for logger_fdset to work (see below). */ + logger_open(tag, LOG_NDELAY|LOG_PID, mu_log_facility); + + /* FIXME */ + if (strcmp(stream, "stderr") == 0) { + mu_debug_default_printer = mu_debug_stderr_printer; + } else { + mu_debug_set_print(debug, mf_diag_syslog_printer, NULL); + mu_debug_default_printer = mf_debug_syslog_printer; + } + + FD_ZERO(&srvman_param.keepfds); + logger_fdset(&srvman_param.keepfds); + if (logger_flags(LOGF_STDERR)) + /* Keep also stdout. + FIXME: Is it still needed? */ + FD_SET(1, &srvman_param.keepfds); +} + +void +mf_server_log_setup(void) +{ + mf_srvcfg_log_setup(syslog_tag, log_stream); } + diff --git a/src/srvcfg.h b/src/srvcfg.h index e6bfa922..8604ab97 100644 --- a/src/srvcfg.h +++ b/src/srvcfg.h @@ -45,12 +45,13 @@ extern time_t smtp_timeout_hard[SMTP_NUM_TIMEOUT]; extern int mf_server_function(const char *key, struct mf_srvcfg *cfg); -void mf_srvcfg_init(const char *label); +void mf_srvcfg_init(const char *progname, const char *label); void mf_srvcfg_add(const char *type, const char *urlstr); void mf_srvcfg_flush(void); void mf_error_on_locus(mu_debug_t err, const char *fmt, ...) MU_PRINTFLIKE(2,3); mu_url_t parse_milter_url(mu_debug_t err, const char *str); +void mf_srvcfg_log_setup(const char *tag, char *stream); |