diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-03-09 11:00:12 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-03-09 11:47:52 +0200 |
commit | 30dfac6b8bc411481c9dd333bd8baab9e15c2d00 (patch) | |
tree | 08209280450a3c569f6d57088f97db482f956d40 /src/main.c | |
parent | fedbf1d7be7a92ae10bd2e2c05f0bf5c10b933ce (diff) | |
download | mailfromd-30dfac6b8bc411481c9dd333bd8baab9e15c2d00.tar.gz mailfromd-30dfac6b8bc411481c9dd333bd8baab9e15c2d00.tar.bz2 |
Fix deferred variable initialization.
The bug was spotted by Brian Kroth.
* src/gram.y (deferred_decl) <locus>: New member.
(defer_initialize_variable): Use string_alloc
instead of literal_lookup. Take additional argument (ptr to locus). All
uses updated.
(apply_deferred_init): Pass a ptr to the actual locus to initialize_variable.
* src/mailfromd.h (defer_initialize_variable): Change signature.
* src/main.c (cb_set_variable): Deduce definition location from
mu_strerr.
* THANKS: Update.
* tests/setvar.at: New testcase.
* tests/Makefile.am (TESTSUITE_AT): Add setvar.at.
* tests/testsuite.at: Include setvar.at.
* tests/invcidr.at: Update experr.
* tests/invcidr2.at: Likewise.
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 28 |
1 files changed, 24 insertions, 4 deletions
@@ -551,4 +551,5 @@ parse_opt(int key, char *arg, struct argp_state *state) { char *p; + struct locus locus = { "<command line>", 1, 0 }; p = strchr(arg, '='); @@ -558,5 +559,5 @@ parse_opt(int key, char *arg, struct argp_state *state) arg); *p++ = 0; - defer_initialize_variable(arg, p); + defer_initialize_variable(arg, p, &locus); break; } @@ -717,5 +718,7 @@ cb_set_variable(void *data, mu_config_value_t *arg) const char *value; char *alloc_str = NULL; - + struct mu_locus mloc; + struct locus locus; + if (mu_cfg_assert_value_type(arg, MU_CFG_ARRAY)) return 1; @@ -750,6 +753,23 @@ cb_set_variable(void *data, mu_config_value_t *arg) abort(); } - - defer_initialize_variable(arg->v.arg.v[0].v.string, value); + + locus.leng = 0; + if (mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, + MU_IOCTL_LOGSTREAM_GET_LOCUS, &mloc)) { + locus.file = "<unknown>"; + locus.line = 0; + locus.point = 0; + } else { + if (mloc.mu_file) { + struct literal *lit = string_alloc(mloc.mu_file, + strlen(mloc.mu_file)); + free(mloc.mu_file); + locus.file = lit->text; + } else + locus.file = "<unknown>"; + locus.line = mloc.mu_line; + locus.point = mloc.mu_col; + } + defer_initialize_variable(arg->v.arg.v[0].v.string, value, &locus); free(alloc_str); return 0; |