diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | gacopyz/gacopyz.h | 1 | ||||
-rw-r--r-- | gacopyz/smfi.c | 6 | ||||
-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 |
7 files changed, 57 insertions, 16 deletions
@@ -1,3 +1,16 @@ +2007-04-03 Sergey Poznyakoff <gray@gnu.org.ua> + + * src/engine.c (concat_args): Print all arguments in debuging + mode. + (mailfromd_daemon): Set single-process mode if requested + * src/mailfromd.h (single_process_option): New variable + * src/prog.c: Fix initialization of toh and computation of + heap bounds in gc. + * src/main.c: New option --single-process (Do not use, unless you + know what you are doing!) + * gacopyz/smfi.c, gacopyz/gacopyz.h (smfi_set_foreground): New + function. + 2007-04-02 Sergey Poznyakoff <gray@gnu.org.ua> * src/gram.y (FOR ..) takes a stmtlist diff --git a/gacopyz/gacopyz.h b/gacopyz/gacopyz.h index 90d3607f..e5353199 100644 --- a/gacopyz/gacopyz.h +++ b/gacopyz/gacopyz.h @@ -209,6 +209,7 @@ extern int smfi_opensocket (int); extern int smfi_register (struct smfiDesc); extern int smfi_main (void); extern int smfi_setbacklog (int); +extern int smfi_set_foreground(int val); extern int smfi_setdbg (int); extern int smfi_settimeout (time_t); extern int smfi_setconn (char *); diff --git a/gacopyz/smfi.c b/gacopyz/smfi.c index 100b619e..661be1c3 100644 --- a/gacopyz/smfi.c +++ b/gacopyz/smfi.c @@ -49,6 +49,12 @@ smfi_setbacklog(int val) } int +smfi_set_foreground(int val) +{ + return gacopyz_set_foreground(milter_conn, val); +} + +int smfi_register(struct smfiDesc desc) { struct timeval t; 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); } |