aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2007-05-04 05:37:38 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2007-05-04 05:37:38 +0000
commit5663888746b3b5e15ab795a1e2bfaae7b2cf768a (patch)
treee1ee007db83ea3832d450ae4d6e2df7010cfbed9 /src
parent076f7df5c40dbc3c791f14e5f55568e46244c0f8 (diff)
downloadmailfromd-5663888746b3b5e15ab795a1e2bfaae7b2cf768a.tar.gz
mailfromd-5663888746b3b5e15ab795a1e2bfaae7b2cf768a.tar.bz2
SIGHUP instructs `mailfromd' to restart itself.
Remove UNIX socket after closing it. git-svn-id: file:///svnroot/mailfromd/trunk@1405 7a8a7f39-df28-0410-adc6-e0d955640f24
Diffstat (limited to 'src')
-rw-r--r--src/bi_io.m48
-rw-r--r--src/engine.c72
-rw-r--r--src/mailfromd.h13
-rw-r--r--src/main.c59
-rw-r--r--src/mtasim.c2
-rw-r--r--src/mu_dbm.c9
6 files changed, 136 insertions, 27 deletions
diff --git a/src/bi_io.m4 b/src/bi_io.m4
index d4439978..e7a2dba9 100644
--- a/src/bi_io.m4
+++ b/src/bi_io.m4
@@ -86,14 +86,6 @@ read_stream_line(struct io_stream *str)
#define REDIRECT_STDIN_P(f) ((f) & (O_WRONLY|O_RDWR))
#define REDIRECT_STDOUT_P(f) ((f) == O_RDONLY || ((f) & (O_RDONLY|O_RDWR)))
-#if defined HAVE_SYSCONF && defined _SC_OPEN_MAX
-# define getmaxfd() sysconf(_SC_OPEN_MAX)
-#elif defined (HAVE_GETDTABLESIZE)
-# define getmaxfd() getdtablesize()
-#else
-# define getmaxfd() 64
-#endif
-
static int
open_program_stream(struct io_stream *str, const char *cmdline, int flags)
{
diff --git a/src/engine.c b/src/engine.c
index ddee0a4b..34c1a49b 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -1282,7 +1282,7 @@ static void
check_local_portspec(char *p)
{
struct stat st;
-
+
if (stat(p, &st)) {
if (errno == ENOENT)
return; /* That's OK. The socket must not exist */
@@ -1290,7 +1290,7 @@ check_local_portspec(char *p)
p, mu_strerror(errno));
exit(EX_SOFTWARE);
} else if (!force_remove) {
- mu_error("File `%s' already exist. Remove it or use --remove option.", p);
+ mu_error("File `%s' already exists. Remove it or use --remove option.", p);
exit(EX_SOFTWARE);
}
@@ -1333,12 +1333,49 @@ check_portspec(char *portspec)
mu_error("Unknown port specification: %s", portspec);
}
+static int x_argc; /* A copy of argc and ... */
+static char **x_argv; /* ... argv */
+static int restart; /* Set to 1 if restart is requested */
+
+void
+save_cmdline(int argc, char **argv)
+{
+ int i;
+
+ if (argc == 0) {
+ /* Clear saved command line */
+ for (i = 0; i < x_argc; i++)
+ free(x_argv[i]);
+ free(x_argv);
+ x_argc = 0;
+ x_argv = NULL;
+ } else if (argv[0][0] != '/') {
+ /* Do not save if argv[0] is not a full file name.
+ An appropriate error message will be issued later,
+ if necessary. */
+ return;
+ }
+ x_argc = argc;
+ x_argv = xcalloc (x_argc + 1, sizeof x_argv[0]);
+ for (i = 0; i < x_argc; i++)
+ x_argv[i] = xstrdup (argv[i]);
+ x_argv[i] = NULL;
+}
+
+
static RETSIGTYPE
sig_stop(int sig)
{
smfi_stop();
}
+static RETSIGTYPE
+sig_restart(int sig)
+{
+ restart = 1;
+ smfi_stop();
+}
+
void
mailfromd_daemon()
{
@@ -1367,7 +1404,19 @@ mailfromd_daemon()
signal(SIGTERM, sig_stop);
signal(SIGQUIT, sig_stop);
- signal(SIGHUP, sig_stop);
+ if (x_argc == 0) {
+ if (!mtasim_option) {
+ if (script_file[0] != '/')
+ mu_error("warning: script file is given "
+ "without full file name");
+ else
+ mu_error("warning: mailfromd started without "
+ "full file name");
+ mu_error("warning: restart (SIGHUP) will not work");
+ }
+ signal(SIGHUP, sig_stop);
+ } else
+ signal(SIGHUP, sig_restart);
signal(SIGINT, sig_stop);
if (!foreground) {
@@ -1383,9 +1432,24 @@ mailfromd_daemon()
umask(0117);
rc = smfi_main();
}
- mu_error("mailfromd terminating");
+
if (rc)
mu_error("exit code = %d, last error status: %s",
rc, strerror (errno));
+ if (restart) {
+ char *s;
+ int i;
+
+ mu_error("mailfromd restarting");
+ mu_daemon_remove_pidfile();
+ for (i = getmaxfd(); i > 0; i--)
+ close(i);
+ execv(x_argv[0], x_argv);
+ log_setup(0);
+ mu_error("cannot restart: %s", mu_strerror(errno));
+ if (mu_argcv_string(x_argc, x_argv, &s) == 0)
+ mu_error("command line was: %s", s);
+ } else
+ mu_error("mailfromd terminating");
exit(rc);
}
diff --git a/src/mailfromd.h b/src/mailfromd.h
index 61bd3ae1..d683448a 100644
--- a/src/mailfromd.h
+++ b/src/mailfromd.h
@@ -129,6 +129,15 @@ enum smtp_state {
#define NUMERIC_BUFSIZE_BOUND INT_BUFSIZE_BOUND(long)
+#if defined HAVE_SYSCONF && defined _SC_OPEN_MAX
+# define getmaxfd() sysconf(_SC_OPEN_MAX)
+#elif defined (HAVE_GETDTABLESIZE)
+# define getmaxfd() getdtablesize()
+#else
+# define getmaxfd() 256
+#endif
+
+
mf_status dns_to_mf_status(dns_status stat);
mf_status resolve_ipstr(const char *ipstr, char **hbuf);
@@ -175,7 +184,9 @@ void disable_prog_trace(const char *modlist);
#define MAILFROMD_COMPACT 5
#define MAILFROMD_SHOW_DEFAULTS 6
+extern char *script_file;
extern int mode;
+extern int mtasim_option;
extern unsigned optimization_level;
extern enum smtp_state test_state;
extern time_t negative_expire_interval;
@@ -560,6 +571,7 @@ void free_symbols(void);
char *regex_flags_to_string(int flags, char *buf, size_t size);
+void log_setup(int want_stderr);
void builtin_setup(void);
void builtin_post_setup(void);
void print_code(void);
@@ -730,6 +742,7 @@ void trace(const char *fmt, ...);
int convert_rate(const char *arg, double *rate);
extern void priv_setup(void);
void mailfromd_daemon(void);
+void save_cmdline(int argc, char **argv);
/* DNS dictionary */
void dict_init(mu_list_t *dict);
diff --git a/src/main.c b/src/main.c
index d389ec46..a954770a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -58,6 +58,7 @@ int script_dump_macros; /* Dump used Sendmail macros */
int script_dump_xref; /* Dump cross-reference */
int do_transcript; /* Enable session transript */
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 */
char *portspec = DEFAULT_SOCKET; /* Communication socket specification */
@@ -813,6 +814,7 @@ enum mailfromd_option {
OPTION_LOCK_RETRY_COUNT,
OPTION_LOCK_RETRY_TIMEOUT,
OPTION_MILTER_TIMEOUT,
+ OPTION_MTASIM,
OPTION_PIDFILE,
OPTION_POSTMASTER_EMAIL,
OPTION_PREDICT_NEXT,
@@ -903,6 +905,8 @@ static struct argp_option options[] = {
GRP+1 },
{ "foreground", OPTION_FOREGROUND, NULL, 0,
N_("Stay in foreground"), GRP+1 },
+ { "mtasim", OPTION_MTASIM, NULL, 0,
+ N_("Run in mtasim compatibility mode"), GRP+1 },
{ "single-process", OPTION_SINGLE_PROCESS, NULL, 0,
N_("Run in single-process mode"), GRP+1 },
{ "pidfile", OPTION_PIDFILE, N_("FILE"), 0,
@@ -1221,6 +1225,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
set_option("milter-timeout", arg, 1);
break;
+ case OPTION_MTASIM:
+ mtasim_option = foreground = 1;
+ break;
+
case OPTION_PIDFILE:
set_option("pidfile", arg, 1);
break;
@@ -1643,6 +1651,34 @@ mailfromd_show_defaults()
db_format_enumerate(db_format_enumerator, NULL);
}
+void
+log_setup(int want_stderr)
+{
+ /* Set up logging */
+ if (!want_stderr) {
+#ifdef USE_SYSLOG_ASYNC
+ openlog_async(syslog_tag, LOG_PID, log_facility);
+ gacopyz_set_logger (mf_gacopyz_syslog_async_log_printer);
+#else
+ openlog(syslog_tag, LOG_PID, log_facility);
+#endif
+ mu_error_set_print(syslog_error_printer);
+ } else {
+ gacopyz_set_logger(gacopyz_stderr_log_printer);
+ mu_error_set_print(stderr_error_printer);
+ }
+}
+
+static int
+stderr_closed_p()
+{
+ int fd = dup(0);
+ if (fd < 0)
+ return 1;
+ close(fd);
+ return fd <= 2;
+}
+
int
main(int argc, char **argv)
{
@@ -1653,15 +1689,20 @@ main(int argc, char **argv)
mu_register_all_mailer_formats();
if (!program_invocation_short_name)
program_invocation_short_name = argv[0];
+
+ /* Set default logging */
log_facility = DEFAULT_LOG_FACILITY;
- mu_error_set_print(stderr_error_printer);
+ log_setup(!stderr_closed_p());
+
init_string_space();
builtin_setup();
db_format_setup();
lex_setup();
+ save_cmdline(argc, argv);
mu_argp_init (program_version, "<" PACKAGE_BUGREPORT ">");
-
mu_argp_parse (&argp, &argc, &argv, 0, capa, &index, NULL);
+
+ log_setup(log_to_stderr);
argv += index;
argc -= index;
@@ -1689,6 +1730,8 @@ main(int argc, char **argv)
argc--;
}
}
+ if (script_file[0] != '/')
+ save_cmdline(0, NULL); /* Clear saved command line */
if (parse_program(script_file, script_ydebug, script_ldebug))
exit(EX_CONFIG);
}
@@ -1708,18 +1751,6 @@ main(int argc, char **argv)
if (script_dump_xref)
print_xref();
- /* Set up default values */
- if (!log_to_stderr) {
-#ifdef USE_SYSLOG_ASYNC
- openlog_async(syslog_tag, LOG_PID, log_facility);
- gacopyz_set_logger (mf_gacopyz_syslog_async_log_printer);
-#else
- openlog(syslog_tag, LOG_PID, log_facility);
-#endif
- mu_error_set_print(syslog_error_printer);
- } else
- gacopyz_set_logger (gacopyz_stderr_log_printer);
-
if (script_dump_macros)
print_used_macros();
diff --git a/src/mtasim.c b/src/mtasim.c
index 4cc12c51..a34d5a20 100644
--- a/src/mtasim.c
+++ b/src/mtasim.c
@@ -587,7 +587,7 @@ start_mailfromd (int argc, char **argv)
xargv[0] = "mailfromd";
for (i = 1; i <= argc; i++)
xargv[i] = argv[i-1];
- xargv[i++] = "--foreground";
+ xargv[i++] = "--mtasim";
xargv[i++] = "--remove";
xargv[i++] = "--port";
xargv[i++] = milter_port;
diff --git a/src/mu_dbm.c b/src/mu_dbm.c
index f97eb02a..b98c0d94 100644
--- a/src/mu_dbm.c
+++ b/src/mu_dbm.c
@@ -17,6 +17,8 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301 USA */
+#define MF_SOURCE_NAME MF_SOURCE_MU_DBM
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@@ -475,6 +477,13 @@ mu_dbm_open (char *name, DBM_FILE *dbm, int flags, int mode, int *ro)
}
db->sync (db, 0);
+
+ __DBG(1)
+ {
+#if DB_VERSION_MAJOR > 2
+ db->set_errcall (db, mu_dbm_errcall_fcn);
+#endif
+ }
dbm->name = strdup (name);
dbm->db = db;

Return to:

Send suggestions and report system problems to the System administrator.