diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-05-04 05:37:38 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-05-04 05:37:38 +0000 |
commit | 5663888746b3b5e15ab795a1e2bfaae7b2cf768a (patch) | |
tree | e1ee007db83ea3832d450ae4d6e2df7010cfbed9 /src | |
parent | 076f7df5c40dbc3c791f14e5f55568e46244c0f8 (diff) | |
download | mailfromd-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.m4 | 8 | ||||
-rw-r--r-- | src/engine.c | 72 | ||||
-rw-r--r-- | src/mailfromd.h | 13 | ||||
-rw-r--r-- | src/main.c | 59 | ||||
-rw-r--r-- | src/mtasim.c | 2 | ||||
-rw-r--r-- | src/mu_dbm.c | 9 |
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); @@ -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; |