diff options
author | Thomas Guyot-Sionnest <dermoth@aei.ca> | 2010-07-02 12:55:19 -0400 |
---|---|---|
committer | Thomas Guyot-Sionnest <dermoth@aei.ca> | 2010-07-02 12:55:19 -0400 |
commit | cf2bcf6c7afa8eb7a54e01f98a9998a7e1ac0852 (patch) | |
tree | 3739ed79238c65567ad1001a4f80856af652f660 /lib | |
parent | 6b6051606175d870bb45bbe67866c1643d4d964a (diff) | |
download | monitoring-plugins-cf2bcf6c7afa8eb7a54e01f98a9998a7e1ac0852.tar.gz |
Fix cmd_run overwriting the environment
Some commands need the environment to function properly. One such
example is check_ssh and check_by_ssh when a SOCKS proxy is required.
This patch use setenv and extern char **environ to alter and pass the
new environment to the child process Those modules have been added to
Gnulib for portability.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/utils_cmd.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/utils_cmd.c b/lib/utils_cmd.c index e10ab918..0c853dcc 100644 --- a/lib/utils_cmd.c +++ b/lib/utils_cmd.c | |||
@@ -48,6 +48,9 @@ | |||
48 | # include <sys/wait.h> | 48 | # include <sys/wait.h> |
49 | #endif | 49 | #endif |
50 | 50 | ||
51 | /* used in _cmd_open to pass the environment to commands */ | ||
52 | extern char **environ; | ||
53 | |||
51 | /** macros **/ | 54 | /** macros **/ |
52 | #ifndef WEXITSTATUS | 55 | #ifndef WEXITSTATUS |
53 | # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) | 56 | # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) |
@@ -122,7 +125,6 @@ cmd_init (void) | |||
122 | static int | 125 | static int |
123 | _cmd_open (char *const *argv, int *pfd, int *pfderr) | 126 | _cmd_open (char *const *argv, int *pfd, int *pfderr) |
124 | { | 127 | { |
125 | char *env[2]; | ||
126 | pid_t pid; | 128 | pid_t pid; |
127 | #ifdef RLIMIT_CORE | 129 | #ifdef RLIMIT_CORE |
128 | struct rlimit limit; | 130 | struct rlimit limit; |
@@ -137,8 +139,7 @@ _cmd_open (char *const *argv, int *pfd, int *pfderr) | |||
137 | if (!_cmd_pids) | 139 | if (!_cmd_pids) |
138 | CMD_INIT; | 140 | CMD_INIT; |
139 | 141 | ||
140 | env[0] = strdup ("LC_ALL=C"); | 142 | setenv("LC_ALL", "C", 1); |
141 | env[1] = '\0'; | ||
142 | 143 | ||
143 | if (pipe (pfd) < 0 || pipe (pfderr) < 0 || (pid = fork ()) < 0) | 144 | if (pipe (pfd) < 0 || pipe (pfderr) < 0 || (pid = fork ()) < 0) |
144 | return -1; /* errno set by the failing function */ | 145 | return -1; /* errno set by the failing function */ |
@@ -169,7 +170,7 @@ _cmd_open (char *const *argv, int *pfd, int *pfderr) | |||
169 | if (_cmd_pids[i] > 0) | 170 | if (_cmd_pids[i] > 0) |
170 | close (i); | 171 | close (i); |
171 | 172 | ||
172 | execve (argv[0], argv, env); | 173 | execve (argv[0], argv, environ); |
173 | _exit (STATE_UNKNOWN); | 174 | _exit (STATE_UNKNOWN); |
174 | } | 175 | } |
175 | 176 | ||