X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcollectd-nagios.c;h=ca72a68cfa0fde685e59a84ec3cd20df3fc4d2d2;hb=953bd0f881faa40c415a1f1a9d7e2da739d343ff;hp=f4dff5bb99a5efeb64d2a48f314c18e458848e03;hpb=250dc17bfb3c5488b789347f1f570913701d31ca;p=collectd.git diff --git a/src/collectd-nagios.c b/src/collectd-nagios.c index f4dff5bb..ca72a68c 100644 --- a/src/collectd-nagios.c +++ b/src/collectd-nagios.c @@ -150,6 +150,7 @@ static int get_values (int *ret_values_num, double **ret_values, char **values_names; int i; + int j; fd = socket (PF_UNIX, SOCK_STREAM, 0); if (fd < 0) @@ -201,12 +202,17 @@ static int get_values (int *ret_values_num, double **ret_values, fclose (fh_out); return (-1); } - fclose (fh_in); fh_in = NULL; fd = -1; - fclose (fh_out); fh_out = NULL; - values_num = atoi (buffer); - if (values_num < 1) - return (-1); + { + char *ptr = strchr (buffer, ' '); + + if (ptr != NULL) + *ptr = '\0'; + + values_num = atoi (buffer); + if (values_num < 1) + return (-1); + } values = (double *) malloc (values_num * sizeof (double)); if (values == NULL) @@ -224,33 +230,61 @@ static int get_values (int *ret_values_num, double **ret_values, free (values); return (-1); } + memset (values_names, 0, values_num * sizeof (char *)); + i = 0; /* index of the values returned by the server */ + j = 0; /* number of values in `values_names' and `values' */ + while (fgets (buffer, sizeof (buffer), fh_in) != NULL) { - char *ptr = strchr (buffer, ' ') + 1; - char *key; - char *value; - - i = 0; - while ((key = strtok (ptr, " \t")) != NULL) + do /* while (0) */ { - ptr = NULL; + char *key; + char *value; + char *endptr; + + key = buffer; + value = strchr (key, '='); if (value == NULL) - continue; - *value = '\0'; value++; + { + fprintf (stderr, "Cannot parse line: %s\n", buffer); + break; + } + *value = 0; + value++; if (ignore_ds (key) != 0) - continue; + break; - values_names[i] = strdup (key); - values[i] = atof (value); + endptr = NULL; + errno = 0; + values[j] = strtod (value, &endptr); + if ((endptr == value) || (errno != 0)) + { + fprintf (stderr, "Could not parse buffer " + "as number: %s\n", value); + break; + } - i++; - if (i >= values_num) + values_names[j] = strdup (key); + if (values_names[j] == NULL) + { + fprintf (stderr, "strdup failed.\n"); break; - } - values_num = i; + } + j++; + } while (0); + + i++; + if (i >= values_num) + break; } + /* Set `values_num' to the number of values actually stored in the + * array. */ + values_num = j; + + fclose (fh_in); fh_in = NULL; fd = -1; + fclose (fh_out); fh_out = NULL; *ret_values_num = values_num; *ret_values = values;