aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO1
-rw-r--r--lib/filenames.h1
-rw-r--r--lib/logger.c2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/calloutd.c33
-rw-r--r--src/engine.c23
-rw-r--r--src/lex.l9
-rw-r--r--src/mailfromd.h3
-rw-r--r--src/main.c55
-rw-r--r--src/savsrv.c27
-rw-r--r--src/srvcfg.c99
-rw-r--r--src/srvcfg.h3
12 files changed, 144 insertions, 114 deletions
diff --git a/TODO b/TODO
index 53c3a06b..3d57e6c2 100644
--- a/TODO
+++ b/TODO
@@ -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)
{
diff --git a/src/lex.l b/src/lex.l
index f3f0e29b..fb06da68 100644
--- a/src/lex.l
+++ b/src/lex.l
@@ -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);
diff --git a/src/main.c b/src/main.c
index 1620fa2b..c7794061 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);

Return to:

Send suggestions and report system problems to the System administrator.