aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2007-04-03 09:25:57 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2007-04-03 09:25:57 +0000
commit2e5e6f45dcb90c6d3bb0ba748f1f23aba685fa44 (patch)
treed6391322faca12f96a0d853b2cce1a2b235898de /src
parentfab084798a10b7e3ac848101c81049d4a90b7e3a (diff)
downloadmailfromd-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.c4
-rw-r--r--src/mailfromd.h1
-rw-r--r--src/main.c8
-rw-r--r--src/prog.c40
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;
diff --git a/src/main.c b/src/main.c
index 438832ff..84ba6edb 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;
diff --git a/src/prog.c b/src/prog.c
index 7431022c..57603615 100644
--- a/src/prog.c
+++ b/src/prog.c
@@ -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);
}

Return to:

Send suggestions and report system problems to the System administrator.