diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-04-03 09:25:57 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-04-03 09:25:57 +0000 |
commit | 2e5e6f45dcb90c6d3bb0ba748f1f23aba685fa44 (patch) | |
tree | d6391322faca12f96a0d853b2cce1a2b235898de /src | |
parent | fab084798a10b7e3ac848101c81049d4a90b7e3a (diff) | |
download | mailfromd-2e5e6f45dcb90c6d3bb0ba748f1f23aba685fa44.tar.gz mailfromd-2e5e6f45dcb90c6d3bb0ba748f1f23aba685fa44.tar.bz2 |
Bug fixes
git-svn-id: file:///svnroot/mailfromd/trunk@1341 7a8a7f39-df28-0410-adc6-e0d955640f24
Diffstat (limited to 'src')
-rw-r--r-- | src/engine.c | 4 | ||||
-rw-r--r-- | src/mailfromd.h | 1 | ||||
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/prog.c | 40 |
4 files changed, 37 insertions, 16 deletions
diff --git a/src/engine.c b/src/engine.c index 88c17136..3529a0e1 100644 --- a/src/engine.c +++ b/src/engine.c @@ -992,7 +992,7 @@ concat_args(const char *fname, char **argv) for (argc = 0; argv[argc]; argc++) ; - if (mu_argcv_string(argc-1, argv+1, &p)) + if (mu_argcv_string(argc, argv, &p)) debug3(70, "Processing %s: %s%s", fname, argv[0], argv[1] ? " (more)" : ""); else @@ -1357,6 +1357,8 @@ mailfromd_daemon() exit(EX_UNAVAILABLE); } + smfi_set_foreground(single_process_option); + signal(SIGTERM, sig_stop); signal(SIGQUIT, sig_stop); signal(SIGHUP, sig_stop); diff --git a/src/mailfromd.h b/src/mailfromd.h index 171ed254..28264f9d 100644 --- a/src/mailfromd.h +++ b/src/mailfromd.h @@ -267,6 +267,7 @@ extern time_t io_timeout; extern time_t connect_timeout; extern time_t response_timeout; extern int foreground; +extern int single_process_option; extern int force_remove; extern int script_dump_macros; extern int script_dump_xref; @@ -63,6 +63,7 @@ char *portspec = DEFAULT_SOCKET; /* Communication socket specification */ int force_remove; /* Remove local communication socket if it already exists */ int foreground; /* Stay in foreground */ +int single_process_option; /* Run in single process mode. */ unsigned long source_address = INADDR_ANY; /* Source address for TCP connections */ char *syslog_tag; /* Tag to mark syslog entries with. */ @@ -907,6 +908,7 @@ enum mailfromd_option { OPTION_POSTMASTER_EMAIL, OPTION_PREDICT_NEXT, OPTION_SHOW_DEFAULTS, + OPTION_SINGLE_PROCESS, OPTION_SOURCE_INFO, OPTION_SYSLOG, OPTION_TIME_FORMAT, @@ -988,6 +990,8 @@ static struct argp_option options[] = { GRP+1 }, { "foreground", OPTION_FOREGROUND, NULL, 0, N_("Stay in foreground"), GRP+1 }, + { "single-process", OPTION_SINGLE_PROCESS, NULL, 0, + N_("Run in single-process mode"), GRP+1 }, { "pidfile", OPTION_PIDFILE, N_("FILE"), 0, N_("Set pidfile name"), GRP+1 }, { "user", 'u', N_("NAME"), 0, @@ -1309,6 +1313,10 @@ parse_opt (int key, char *arg, struct argp_state *state) need_config = 0; break; + case OPTION_SINGLE_PROCESS: + single_process_option = 1; + break; + case OPTION_SOURCE_INFO: set_option("source-info", "yes", 1); break; @@ -225,6 +225,13 @@ disable_prog_trace(const char *modlist) } } +/* ======================================================================== + Drzewa w górę, rzeki w dół. + + Jacek Kaczmarski. + "Upadek Ikara" + ======================================================================== */ + /* Run-time evaluation */ struct eval_environ { @@ -2053,7 +2060,7 @@ create_environment(SMFICTX *ctx, in env_init. The top of heap should be retained across calls to handlers, since we store string variables there. This raises stack size requirements. */ - env->toh = datasize + env->stack_size - 1; + env->toh = datasize; env->bi_priv_array = NULL; @@ -2221,8 +2228,8 @@ void env_final_gc(eval_environ_t env) { size_t i; - size_t top = env->toh; - size_t bot = datasize + env->stack_size; + size_t top = datasize; + size_t bot = env->toh; genv = env; /* Prepare s_off/s_count: remove any variables that are not @@ -2233,19 +2240,22 @@ env_final_gc(eval_environ_t env) if (top < p && p < bot) s_off[s_cnt++] = dataseg_reloc[i]; } - qsort(s_off, s_cnt, sizeof s_off[0], s_off_cmp); - /* Compact the variables */ - env->toh = datasize; - for (i = 0; i < s_cnt; i++) { - size_t off = s_off[i]; - char *p = (char*) env_data_ref(env, - (size_t) env->dataseg[off]); - size_t len = strlen(p) + 1; - size_t q = heap_reserve(env, len); - memmove(env_data_ref(env, q), p, len); - env->dataseg[off] = (STKVAL) q; + if (s_cnt) { + qsort(s_off, s_cnt, sizeof s_off[0], s_off_cmp); + + /* Compact the variables */ + env->toh = datasize; + for (i = 0; i < s_cnt; i++) { + size_t off = s_off[i]; + char *p = (char*) env_data_ref(env, + (size_t) env->dataseg[off]); + size_t len = strlen(p) + 1; + size_t q = heap_reserve(env, len); + memmove(env_data_ref(env, q), p, len); + env->dataseg[off] = (STKVAL) q; + } + free(s_off); } - free(s_off); } |