summaryrefslogtreecommitdiff
path: root/daemons/dmeventd
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2018-03-05 15:09:16 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2018-03-06 15:35:04 +0100
commit9be086fbeef0a24fc6f441dec29ee2385bca0280 (patch)
tree5de96a36882b03ca87c9294c16045f9284c9df2a /daemons/dmeventd
parent406d6de651fd1ae3bda80f3597d7aa8733b0389a (diff)
downloadlvm2-9be086fbeef0a24fc6f441dec29ee2385bca0280.tar.gz
thin: pass environment to scripts
When dmeventd thin plugin forks a configurable script, switch to use execvp to pass whole environment present to dmeventd - so all configured paths present at dmeventd startup are visible to script. This was likely not a problem for common user enviroment, however in test suite case variable like LVM_SYSTEM_DIR were not actually used from test itself but rather from a system present lvm.conf and this may have cause strange behavior of a testing script.
Diffstat (limited to 'daemons/dmeventd')
-rw-r--r--daemons/dmeventd/plugins/thin/dmeventd_thin.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/daemons/dmeventd/plugins/thin/dmeventd_thin.c b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
index 404519bc8..29b0391be 100644
--- a/daemons/dmeventd/plugins/thin/dmeventd_thin.c
+++ b/daemons/dmeventd/plugins/thin/dmeventd_thin.c
@@ -64,23 +64,23 @@ DM_EVENT_LOG_FN("thin")
static int _run_command(struct dso_state *state)
{
- char val[3][36];
- char *env[] = { val[0], val[1], val[2], NULL };
+ char val[16];
int i;
/* Mark for possible lvm2 command we are running from dmeventd
* lvm2 will not try to talk back to dmeventd while processing it */
- (void) dm_snprintf(val[0], sizeof(val[0]), "LVM_RUN_BY_DMEVENTD=1");
+ (void) setenv("LVM_RUN_BY_DMEVENTD", "1", 1);
if (state->data_percent) {
/* Prepare some known data to env vars for easy use */
- (void) dm_snprintf(val[1], sizeof(val[1]), "DMEVENTD_THIN_POOL_DATA=%d",
- state->data_percent / DM_PERCENT_1);
- (void) dm_snprintf(val[2], sizeof(val[2]), "DMEVENTD_THIN_POOL_METADATA=%d",
- state->metadata_percent / DM_PERCENT_1);
+ if (dm_snprintf(val, sizeof(val), "%d",
+ state->data_percent / DM_PERCENT_1) != -1)
+ (void) setenv("DMEVENTD_THIN_POOL_DATA", val, 1);
+ if (dm_snprintf(val, sizeof(val), "%d",
+ state->metadata_percent / DM_PERCENT_1) != -1)
+ (void) setenv("DMEVENTD_THIN_POOL_METADATA", val, 1);
} else {
/* For an error event it's for a user to check status and decide */
- env[1] = NULL;
log_debug("Error event processing.");
}
@@ -95,7 +95,7 @@ static int _run_command(struct dso_state *state)
/* child */
(void) close(0);
for (i = 3; i < 255; ++i) (void) close(i);
- execve(state->argv[0], state->argv, env);
+ execvp(state->argv[0], state->argv);
_exit(errno);
} else if (state->pid == -1) {
log_error("Can't fork command %s.", state->cmd_str);