X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fexec.c;h=c5ea155ebc53f10e4d191bc84dca0828476a953a;hb=3904b4b9fd1a53c93f31d8fec709a7b7b8300513;hp=c64f949fc57b4ac5cff424a6b27e7cd283e13184;hpb=b34e15480992d9433a0e3fda47b5f6d387bfda5e;p=collectd.git diff --git a/src/exec.c b/src/exec.c index c64f949f..c5ea155e 100644 --- a/src/exec.c +++ b/src/exec.c @@ -93,7 +93,7 @@ static void sigchld_handler (int __attribute__((unused)) signal) /* {{{ */ program_list_t *pl; for (pl = pl_head; pl != NULL; pl = pl->next) if (pl->pid == pid) - break; + break; if (pl != NULL) pl->status = status; } /* while (waitpid) */ @@ -108,20 +108,20 @@ static int exec_config_exec (oconfig_item_t *ci) /* {{{ */ if (ci->children_num != 0) { WARNING ("exec plugin: The config option `%s' may not be a block.", - ci->key); + ci->key); return (-1); } if (ci->values_num < 2) { WARNING ("exec plugin: The config option `%s' needs at least two " - "arguments.", ci->key); + "arguments.", ci->key); return (-1); } if ((ci->values[0].type != OCONFIG_TYPE_STRING) || (ci->values[1].type != OCONFIG_TYPE_STRING)) { WARNING ("exec plugin: The first two arguments to the `%s' option must " - "be string arguments.", ci->key); + "be string arguments.", ci->key); return (-1); } @@ -201,15 +201,15 @@ static int exec_config_exec (oconfig_item_t *ci) /* {{{ */ { if (ci->values[i + 1].type == OCONFIG_TYPE_NUMBER) { - ssnprintf (buffer, sizeof (buffer), "%lf", - ci->values[i + 1].value.number); + ssnprintf (buffer, sizeof (buffer), "%lf", + ci->values[i + 1].value.number); } else { - if (ci->values[i + 1].value.boolean) - sstrncpy (buffer, "true", sizeof (buffer)); - else - sstrncpy (buffer, "false", sizeof (buffer)); + if (ci->values[i + 1].value.boolean) + sstrncpy (buffer, "true", sizeof (buffer)); + else + sstrncpy (buffer, "false", sizeof (buffer)); } pl->argv[i] = strdup (buffer); @@ -254,7 +254,7 @@ static int exec_config (oconfig_item_t *ci) /* {{{ */ { oconfig_item_t *child = ci->children + i; if ((strcasecmp ("Exec", child->key) == 0) - || (strcasecmp ("NotificationExec", child->key) == 0)) + || (strcasecmp ("NotificationExec", child->key) == 0)) exec_config_exec (child); else { @@ -270,22 +270,19 @@ static void set_environment (void) /* {{{ */ char buffer[1024]; #ifdef HAVE_SETENV - ssnprintf (buffer, sizeof (buffer), "%i", interval_g); + ssnprintf (buffer, sizeof (buffer), "%.3f", CDTIME_T_TO_DOUBLE (interval_g)); setenv ("COLLECTD_INTERVAL", buffer, /* overwrite = */ 1); ssnprintf (buffer, sizeof (buffer), "%s", hostname_g); setenv ("COLLECTD_HOSTNAME", buffer, /* overwrite = */ 1); #else - ssnprintf (buffer, sizeof (buffer), "COLLECTD_INTERVAL=%i", interval_g); + ssnprintf (buffer, sizeof (buffer), "COLLECTD_INTERVAL=%.3f", + CDTIME_T_TO_DOUBLE (interval_g)); putenv (buffer); ssnprintf (buffer, sizeof (buffer), "COLLECTD_HOSTNAME=%s", hostname_g); putenv (buffer); #endif - -#ifdef HAVE_SETENV -#else -#endif } /* }}} void set_environment */ __attribute__((noreturn)) @@ -306,7 +303,7 @@ static void exec_child (program_list_t *pl) /* {{{ */ if (status != 0) { ERROR ("exec plugin: Failed to get user information for user ``%s'': %s", - pl->user, sstrerror (errno, errbuf, sizeof (errbuf))); + pl->user, sstrerror (errno, errbuf, sizeof (errbuf))); exit (-1); } if (sp_ptr == NULL) @@ -335,15 +332,15 @@ static void exec_child (program_list_t *pl) /* {{{ */ status = getgrnam_r (pl->group, &gr, nambuf, sizeof (nambuf), &gr_ptr); if (0 != status) { - ERROR ("exec plugin: Failed to get group information " - "for group ``%s'': %s", pl->group, - sstrerror (errno, errbuf, sizeof (errbuf))); - exit (-1); + ERROR ("exec plugin: Failed to get group information " + "for group ``%s'': %s", pl->group, + sstrerror (errno, errbuf, sizeof (errbuf))); + exit (-1); } if (NULL == gr_ptr) { - ERROR ("exec plugin: No such group: `%s'", pl->group); - exit (-1); + ERROR ("exec plugin: No such group: `%s'", pl->group); + exit (-1); } egid = gr.gr_gid; @@ -377,7 +374,7 @@ static void exec_child (program_list_t *pl) /* {{{ */ if (status != 0) { ERROR ("exec plugin: setgid (%i) failed: %s", - gid, sstrerror (errno, errbuf, sizeof (errbuf))); + gid, sstrerror (errno, errbuf, sizeof (errbuf))); exit (-1); } @@ -387,7 +384,7 @@ static void exec_child (program_list_t *pl) /* {{{ */ if (status != 0) { ERROR ("exec plugin: setegid (%i) failed: %s", - egid, sstrerror (errno, errbuf, sizeof (errbuf))); + egid, sstrerror (errno, errbuf, sizeof (errbuf))); exit (-1); } } @@ -396,7 +393,7 @@ static void exec_child (program_list_t *pl) /* {{{ */ if (status != 0) { ERROR ("exec plugin: setuid (%i) failed: %s", - uid, sstrerror (errno, errbuf, sizeof (errbuf))); + uid, sstrerror (errno, errbuf, sizeof (errbuf))); exit (-1); } @@ -438,7 +435,7 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) if (status != 0) { ERROR ("exec plugin: pipe failed: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); + sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } @@ -446,7 +443,7 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) if (status != 0) { ERROR ("exec plugin: pipe failed: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); + sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } @@ -454,7 +451,7 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) if (status != 0) { ERROR ("exec plugin: pipe failed: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); + sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } @@ -462,7 +459,7 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) if (pid < 0) { ERROR ("exec plugin: fork failed: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); + sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } else if (pid == 0) @@ -475,9 +472,9 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) for (fd = 0; fd < fd_num; fd++) { if ((fd == fd_pipe_in[0]) - || (fd == fd_pipe_out[1]) - || (fd == fd_pipe_err[1])) - continue; + || (fd == fd_pipe_out[1]) + || (fd == fd_pipe_err[1])) + continue; close (fd); } @@ -541,12 +538,9 @@ static int parse_line (char *buffer) /* {{{ */ return (handle_putnotif (stdout, buffer)); else { - /* For backwards compatibility */ - char tmp[1220]; - /* Let's annoy the user a bit.. */ - INFO ("exec plugin: Prepending `PUTVAL' to this line: %s", buffer); - ssnprintf (tmp, sizeof (tmp), "PUTVAL %s", buffer); - return (handle_putval (stdout, tmp)); + ERROR ("exec plugin: Unable to parse command, ignoring line: \"%s\"", + buffer); + return (-1); } } /* int parse_line }}} */ @@ -584,10 +578,18 @@ static void *exec_read_one (void *arg) /* {{{ */ /* We use a copy of fdset, as select modifies it */ copy = fdset; - while (select(highest_fd + 1, ©, NULL, NULL, NULL ) > 0) + while (1) { int len; + status = select (highest_fd + 1, ©, NULL, NULL, NULL); + if (status < 0) + { + if (errno == EINTR) + continue; + break; + } + if (FD_ISSET(fd, ©)) { char *pnl; @@ -638,14 +640,14 @@ static void *exec_read_one (void *arg) /* {{{ */ } else if (len == 0) { - /* We've reached EOF */ - NOTICE ("exec plugin: Program `%s' has closed STDERR.", - pl->exec); - close (fd_err); - FD_CLR (fd_err, &fdset); - highest_fd = fd; - fd_err = -1; - continue; + /* We've reached EOF */ + NOTICE ("exec plugin: Program `%s' has closed STDERR.", + pl->exec); + close (fd_err); + FD_CLR (fd_err, &fdset); + highest_fd = fd; + fd_err = -1; + continue; } pbuffer_err[len] = '\0'; @@ -719,7 +721,7 @@ static void *exec_notification_one (void *arg) /* {{{ */ { char errbuf[1024]; ERROR ("exec plugin: fdopen (%i) failed: %s", fd, - sstrerror (errno, errbuf, sizeof (errbuf))); + sstrerror (errno, errbuf, sizeof (errbuf))); kill (pl->pid, SIGTERM); pl->pid = 0; close (fd); @@ -735,8 +737,8 @@ static void *exec_notification_one (void *arg) /* {{{ */ fprintf (fh, "Severity: %s\n" - "Time: %u\n", - severity, (unsigned int) n->time); + "Time: %.3f\n", + severity, CDTIME_T_TO_DOUBLE (n->time)); /* Print the optional fields */ if (strlen (n->host) > 0) @@ -762,7 +764,7 @@ static void *exec_notification_one (void *arg) /* {{{ */ fprintf (fh, "%s: %e\n", meta->name, meta->nm_value.nm_double); else if (meta->type == NM_TYPE_BOOLEAN) fprintf (fh, "%s: %s\n", meta->name, - meta->nm_value.nm_boolean ? "true" : "false"); + meta->nm_value.nm_boolean ? "true" : "false"); } fprintf (fh, "\n%s\n", n->message); @@ -845,7 +847,7 @@ static int exec_notification (const notification_t *n, /* {{{ */ continue; pln = (program_list_and_notification_t *) malloc (sizeof - (program_list_and_notification_t)); + (program_list_and_notification_t)); if (pln == NULL) { ERROR ("exec plugin: malloc failed.");