summaryrefslogtreecommitdiffstats
path: root/src/lib/run_event.c
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-03-08 14:07:33 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2011-03-08 14:07:33 +0100
commitabb11fca1bcd7932d14c911d63fb7c6c347dcbcd (patch)
tree219ca2f09a7f8d7c310aca9456624a7f37b8716b /src/lib/run_event.c
parent077b157218254437185b5cb9d0267df72a918b79 (diff)
downloadabrt-abb11fca1bcd7932d14c911d63fb7c6c347dcbcd.tar.gz
abrt-abb11fca1bcd7932d14c911d63fb7c6c347dcbcd.tar.xz
abrt-abb11fca1bcd7932d14c911d63fb7c6c347dcbcd.zip
make fork_execv_on_steroids capable of setting env vars too
Before, it could only unset them. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/lib/run_event.c')
-rw-r--r--src/lib/run_event.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/lib/run_event.c b/src/lib/run_event.c
index a2bbc76b..3d2b3a22 100644
--- a/src/lib/run_event.c
+++ b/src/lib/run_event.c
@@ -245,18 +245,19 @@ int spawn_next_command(struct run_event_state *state,
VERB1 log("Executing '%s'", cmd);
/* Export some useful environment variables for children */
+ char *env_vec[3];
/* Just exporting dump_dir_name isn't always ok: it can be "."
* and some children want to cd to other directory but still
* be able to find dump directory by using $DUMP_DIR...
*/
char *full_name = realpath(dump_dir_name, NULL);
- setenv("DUMP_DIR", (full_name ? full_name : dump_dir_name), 1);
+ env_vec[0] = xasprintf("DUMP_DIR=%s", (full_name ? full_name : dump_dir_name));
free(full_name);
- setenv("EVENT", event, 1);
-//FIXME: set vars in the child, not here! Need to improve fork_execv_on_steroids...
+ env_vec[1] = xasprintf("EVENT=%s", event);
+ env_vec[2] = NULL;
char *argv[4];
- argv[0] = (char*)"/bin/sh";
+ argv[0] = (char*)"/bin/sh"; // TODO: honor $SHELL?
argv[1] = (char*)"-c";
argv[2] = cmd;
argv[3] = NULL;
@@ -266,12 +267,15 @@ int spawn_next_command(struct run_event_state *state,
EXECFLG_INPUT_NUL + EXECFLG_OUTPUT + EXECFLG_ERR2OUT,
argv,
pipefds,
- /* unsetenv_vec: */ NULL,
+ /* env_vec: */ env_vec,
/* dir: */ dump_dir_name,
/* uid(unused): */ 0
);
state->command_out_fd = pipefds[0];
+ free(env_vec[0]);
+ free(env_vec[1]);
+
state->commands = g_list_remove(state->commands, cmd);
return 0;