X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fexec.c;h=9574f2c4bf4a252dd87ae76910f3dc4f8057ebd6;hb=a503c54a95d139f117650a0e6d80e6edfe81e8bf;hp=162565224b2fdc9d5237bc91e3c026ddc25c9bb0;hpb=41532dee9fc88023e67d6a7e73d7d99617f5148f;p=collectd.git diff --git a/src/exec.c b/src/exec.c index 16256522..9574f2c4 100644 --- a/src/exec.c +++ b/src/exec.c @@ -28,11 +28,11 @@ #include "collectd.h" -#include "common.h" #include "plugin.h" +#include "utils/common/common.h" -#include "utils_cmd_putnotif.h" -#include "utils_cmd_putval.h" +#include "utils/cmds/putnotif.h" +#include "utils/cmds/putval.h" #include #include @@ -245,11 +245,17 @@ static int exec_config(oconfig_item_t *ci) /* {{{ */ return 0; } /* int exec_config }}} */ +#if !defined(HAVE_SETENV) +static char env_interval[64]; +// max hostname len is 255, so this should be enough +static char env_hostname[300]; +#endif + static void set_environment(void) /* {{{ */ { +#ifdef HAVE_SETENV char buffer[1024]; -#ifdef HAVE_SETENV snprintf(buffer, sizeof(buffer), "%.3f", CDTIME_T_TO_DOUBLE(plugin_get_interval())); setenv("COLLECTD_INTERVAL", buffer, /* overwrite = */ 1); @@ -257,15 +263,29 @@ static void set_environment(void) /* {{{ */ sstrncpy(buffer, hostname_g, sizeof(buffer)); setenv("COLLECTD_HOSTNAME", buffer, /* overwrite = */ 1); #else - snprintf(buffer, sizeof(buffer), "COLLECTD_INTERVAL=%.3f", + snprintf(env_interval, sizeof(env_interval), "COLLECTD_INTERVAL=%.3f", CDTIME_T_TO_DOUBLE(plugin_get_interval())); - putenv(buffer); + putenv(env_interval); - snprintf(buffer, sizeof(buffer), "COLLECTD_HOSTNAME=%s", hostname_g); - putenv(buffer); + snprintf(env_hostname, sizeof(env_hostname), "COLLECTD_HOSTNAME=%s", + hostname_g); + putenv(env_hostname); #endif } /* }}} void set_environment */ +static void unset_environment(void) /* {{{ */ +{ +#ifdef HAVE_SETENV + unsetenv("COLLECTD_INTERVAL"); + unsetenv("COLLECTD_HOSTNAME"); +#else + snprintf(env_interval, sizeof(env_interval), "COLLECTD_INTERVAL"); + putenv(env_interval); + snprintf(env_hostname, sizeof(env_hostname), "COLLECTD_HOSTNAME"); + putenv(env_hostname); +#endif +} /* }}} void unset_environment */ + __attribute__((noreturn)) static void exec_child(program_list_t *pl, int uid, int gid, int egid) /* {{{ */ { @@ -359,8 +379,8 @@ static int getegr_id(program_list_t *pl, int gid) /* {{{ */ if (pl->group == NULL) { return -1; } - if (strcmp(pl->group,"") == 0) { - return gid; + if (strcmp(pl->group, "") == 0) { + return gid; } struct group *gr_ptr = NULL; struct group gr; @@ -376,22 +396,22 @@ static int getegr_id(program_list_t *pl, int gid) /* {{{ */ do { temp = realloc(grbuf, grbuf_size); - if ( temp == NULL ) { + if (temp == NULL) { ERROR("exec plugin: getegr_id for %s: realloc buffer[%ld] failed ", - pl->group, grbuf_size); + pl->group, grbuf_size); sfree(grbuf); return -2; } grbuf = temp; - if(getgrnam_r(pl->group, &gr, grbuf, grbuf_size, &gr_ptr) == 0) { + if (getgrnam_r(pl->group, &gr, grbuf, grbuf_size, &gr_ptr) == 0) { sfree(grbuf); if (gr_ptr == NULL) { - ERROR("exec plugin: No such group: `%s'", pl->group); + ERROR("exec plugin: No such group: `%s'", pl->group); return -1; } return gr.gr_gid; - } else if ( errno == ERANGE) { - grbuf_size += grbuf_size; // increment buffer size and try again + } else if (errno == ERANGE) { + grbuf_size += grbuf_size; // increment buffer size and try again } else { ERROR("exec plugin: getegr_id failed %s", STRERRNO); sfree(grbuf); @@ -466,6 +486,8 @@ static int fork_child(program_list_t *pl, int *fd_in, int *fd_out, goto failed; } + set_environment(); + pid = fork(); if (pid < 0) { ERROR("exec plugin: fork failed: %s", STRERRNO); @@ -500,8 +522,6 @@ static int fork_child(program_list_t *pl, int *fd_in, int *fd_out, close(fd_pipe_err[1]); } - set_environment(); - /* Unblock all signals */ reset_signal_mask(); @@ -509,6 +529,8 @@ static int fork_child(program_list_t *pl, int *fd_in, int *fd_out, /* does not return */ } + unset_environment(); + close(fd_pipe_in[0]); close(fd_pipe_out[1]); close(fd_pipe_err[1]); @@ -531,6 +553,8 @@ static int fork_child(program_list_t *pl, int *fd_in, int *fd_out, return pid; failed: + unset_environment(); + close_pipe(fd_pipe_in); close_pipe(fd_pipe_out); close_pipe(fd_pipe_err); @@ -730,8 +754,9 @@ static void *exec_notification_one(void *arg) /* {{{ */ else if (n->severity == NOTIF_OKAY) severity = "OKAY"; - fprintf(fh, "Severity: %s\n" - "Time: %.3f\n", + fprintf(fh, + "Severity: %s\n" + "Time: %.3f\n", severity, CDTIME_T_TO_DOUBLE(n->time)); /* Print the optional fields */