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 | ||
