X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fexec.c;h=a78f902fdef5634b11baaae07045a8ea85578ee5;hb=074b4980bc75bea6826e6a38dcc6e193a721b2a8;hp=70c1c18476c1683d7d555b25c16282173402806f;hpb=36e53c066210874f01da525f8c823c137c9574b4;p=collectd.git diff --git a/src/exec.c b/src/exec.c index 70c1c184..a78f902f 100644 --- a/src/exec.c +++ b/src/exec.c @@ -170,10 +170,9 @@ static int exec_config_exec (oconfig_item_t *ci) /* {{{ */ { char *tmp = strrchr (ci->values[1].value.string, '/'); if (tmp == NULL) - strncpy (buffer, ci->values[1].value.string, sizeof (buffer)); + sstrncpy (buffer, ci->values[1].value.string, sizeof (buffer)); else - strncpy (buffer, tmp + 1, sizeof (buffer)); - buffer[sizeof (buffer) - 1] = '\0'; + sstrncpy (buffer, tmp + 1, sizeof (buffer)); } pl->argv[0] = strdup (buffer); if (pl->argv[0] == NULL) @@ -196,17 +195,16 @@ static int exec_config_exec (oconfig_item_t *ci) /* {{{ */ { if (ci->values[i + 1].type == OCONFIG_TYPE_NUMBER) { - snprintf (buffer, sizeof (buffer), "%lf", + ssnprintf (buffer, sizeof (buffer), "%lf", ci->values[i + 1].value.number); } else { if (ci->values[i + 1].value.boolean) - strncpy (buffer, "true", sizeof (buffer)); + sstrncpy (buffer, "true", sizeof (buffer)); else - strncpy (buffer, "false", sizeof (buffer)); + sstrncpy (buffer, "false", sizeof (buffer)); } - buffer[sizeof (buffer) - 1] = '\0'; pl->argv[i] = strdup (buffer); } @@ -429,9 +427,19 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) } else if (pid == 0) { - close (fd_pipe_in[1]); - close (fd_pipe_out[0]); - close (fd_pipe_err[0]); + int fd_num; + int fd; + + /* Close all file descriptors but the pipe end we need. */ + fd_num = getdtablesize (); + for (fd = 0; fd < fd_num; fd++) + { + if ((fd == fd_pipe_in[0]) + || (fd == fd_pipe_out[1]) + || (fd == fd_pipe_err[1])) + continue; + close (fd); + } /* Connect the `in' pipe to STDIN */ if (fd_pipe_in[0] != STDIN_FILENO) @@ -482,19 +490,19 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) static int parse_line (char *buffer) /* {{{ */ { - char *fields[256]; - int fields_num; - - fields[0] = "PUTVAL"; - fields_num = strsplit (buffer, fields + 1, STATIC_ARRAY_SIZE(fields) - 1); - - if (strcasecmp (fields[1], "putval") == 0) - return (handle_putval (stdout, fields + 1, fields_num)); - else if (strcasecmp (fields[1], "putnotif") == 0) - return (handle_putnotif (stdout, fields + 1, fields_num)); - - /* compatibility code */ - return (handle_putval (stdout, fields, fields_num + 1)); + if (strncasecmp ("PUTVAL", buffer, strlen ("PUTVAL")) == 0) + return (handle_putval (stdout, buffer)); + else if (strncasecmp ("PUTNOTIF", buffer, strlen ("PUTNOTIF")) == 0) + 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)); + } } /* int parse_line }}} */ static void *exec_read_one (void *arg) /* {{{ */ @@ -629,7 +637,8 @@ static void *exec_read_one (void *arg) /* {{{ */ static void *exec_notification_one (void *arg) /* {{{ */ { program_list_t *pl = ((program_list_and_notification_t *) arg)->pl; - const notification_t *n = &((program_list_and_notification_t *) arg)->n; + notification_t *n = &((program_list_and_notification_t *) arg)->n; + notification_meta_t *meta; int fd; FILE *fh; int pid; @@ -678,6 +687,21 @@ static void *exec_notification_one (void *arg) /* {{{ */ if (strlen (n->type_instance) > 0) fprintf (fh, "TypeInstance: %s\n", n->type_instance); + for (meta = n->meta; meta != NULL; meta = meta->next) + { + if (meta->type == NM_TYPE_STRING) + fprintf (fh, "%s: %s\n", meta->name, meta->nm_value.nm_string); + else if (meta->type == NM_TYPE_SIGNED_INT) + fprintf (fh, "%s: %"PRIi64"\n", meta->name, meta->nm_value.nm_signed_int); + else if (meta->type == NM_TYPE_UNSIGNED_INT) + fprintf (fh, "%s: %"PRIu64"\n", meta->name, meta->nm_value.nm_unsigned_int); + else if (meta->type == NM_TYPE_DOUBLE) + 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"); + } + fprintf (fh, "\n%s\n", n->message); fflush (fh); @@ -688,6 +712,7 @@ static void *exec_notification_one (void *arg) /* {{{ */ DEBUG ("exec plugin: Child %i exited with status %i.", pid, status); + plugin_notification_meta_free (n); sfree (arg); pthread_exit ((void *) 0); return (NULL); @@ -764,6 +789,11 @@ static int exec_notification (const notification_t *n) pln->pl = pl; memcpy (&pln->n, n, sizeof (notification_t)); + /* Set the `meta' member to NULL, otherwise `plugin_notification_meta_copy' + * will run into an endless loop. */ + pln->n.meta = NULL; + plugin_notification_meta_copy (&pln->n, n); + pthread_attr_init (&attr); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); pthread_create (&t, &attr, exec_notification_one, (void *) pln);