Merge branch 'collectd-5.5' into collectd-5.6
[collectd.git] / src / table.c
index 745ec13..81e9461 100644 (file)
@@ -1,19 +1,24 @@
 /**
  * collectd - src/table.c
- * Copyright (C) 2009  Sebastian Harl
+ * Copyright (C) 2009       Sebastian Harl
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; only version 2 of the License is applicable.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
  *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  *
  * Authors:
  *   Sebastian Harl <sh at tokkee.org>
@@ -24,9 +29,9 @@
  */
 
 #include "collectd.h"
+
 #include "common.h"
 
-#include "configfile.h"
 #include "plugin.h"
 
 #define log_err(...) ERROR ("table plugin: " __VA_ARGS__)
  */
 
 typedef struct {
-       char  *type;
-       char  *instance_prefix;
-       int   *instances;
-       size_t instances_num;
-       int   *values;
-       size_t values_num;
+       char   *type;
+       char   *instance_prefix;
+       size_t *instances;
+       size_t  instances_num;
+       size_t *values;
+       size_t  values_num;
 
        const data_set_t *ds;
 } tbl_result_t;
@@ -100,13 +105,11 @@ static void tbl_setup (tbl_t *tbl, char *file)
 
 static void tbl_clear (tbl_t *tbl)
 {
-       size_t i;
-
        sfree (tbl->file);
        sfree (tbl->sep);
        sfree (tbl->instance);
 
-       for (i = 0; i < tbl->results_num; ++i)
+       for (size_t i = 0; i < tbl->results_num; ++i)
                tbl_result_clear (tbl->results + i);
        sfree (tbl->results);
        tbl->results_num = 0;
@@ -134,38 +137,39 @@ static int tbl_config_set_s (char *name, char **var, oconfig_item_t *ci)
        return 0;
 } /* tbl_config_set_separator */
 
-static int tbl_config_append_array_i (char *name, int **var, size_t *len,
+static int tbl_config_append_array_i (char *name, size_t **var, size_t *len,
                oconfig_item_t *ci)
 {
-       int *tmp;
-
-       size_t i;
+       size_t *tmp;
+       size_t num;
 
        if (1 > ci->values_num) {
                log_err ("\"%s\" expects at least one argument.", name);
                return 1;
        }
 
-       for (i = 0; i < ci->values_num; ++i) {
+       num = (size_t) ci->values_num;
+       for (size_t i = 0; i < num; ++i) {
                if (OCONFIG_TYPE_NUMBER != ci->values[i].type) {
                        log_err ("\"%s\" expects numerical arguments only.", name);
                        return 1;
                }
        }
 
-       *len += ci->values_num;
-       tmp = (int *)realloc (*var, *len * sizeof (**var));
+       tmp = realloc (*var, ((*len) + num) * sizeof (**var));
        if (NULL == tmp) {
                char errbuf[1024];
                log_err ("realloc failed: %s.",
                                sstrerror (errno, errbuf, sizeof (errbuf)));
                return -1;
        }
-
        *var = tmp;
 
-       for (i = *len - ci->values_num; i < *len; ++i)
-               (*var)[i] = (int)ci->values[i].value.number;
+       for (size_t i = 0; i < num; ++i) {
+               (*var)[*len] = (size_t) ci->values[i].value.number;
+               (*len)++;
+       }
+
        return 0;
 } /* tbl_config_append_array_s */
 
@@ -174,14 +178,13 @@ static int tbl_config_result (tbl_t *tbl, oconfig_item_t *ci)
        tbl_result_t *res;
 
        int status = 0;
-       size_t i;
 
        if (0 != ci->values_num) {
                log_err ("<Result> does not expect any arguments.");
                return 1;
        }
 
-       res = (tbl_result_t *)realloc (tbl->results,
+       res = realloc (tbl->results,
                        (tbl->results_num + 1) * sizeof (*tbl->results));
        if (res == NULL) {
                char errbuf[1024];
@@ -196,7 +199,7 @@ static int tbl_config_result (tbl_t *tbl, oconfig_item_t *ci)
        res = tbl->results + tbl->results_num - 1;
        tbl_result_setup (res);
 
-       for (i = 0; i < ci->children_num; ++i) {
+       for (int i = 0; i < ci->children_num; ++i) {
                oconfig_item_t *c = ci->children + i;
 
                if (0 == strcasecmp (c->key, "Type"))
@@ -239,7 +242,6 @@ static int tbl_config_table (oconfig_item_t *ci)
        tbl_t *tbl;
 
        int status = 0;
-       size_t i;
 
        if ((1 != ci->values_num)
                        || (OCONFIG_TYPE_STRING != ci->values[0].type)) {
@@ -247,7 +249,7 @@ static int tbl_config_table (oconfig_item_t *ci)
                return 1;
        }
 
-       tbl = (tbl_t *)realloc (tables, (tables_num + 1) * sizeof (*tables));
+       tbl = realloc (tables, (tables_num + 1) * sizeof (*tables));
        if (NULL == tbl) {
                char errbuf[1024];
                log_err ("realloc failed: %s.",
@@ -261,7 +263,7 @@ static int tbl_config_table (oconfig_item_t *ci)
        tbl = tables + tables_num - 1;
        tbl_setup (tbl, ci->values[0].value.string);
 
-       for (i = 0; i < ci->children_num; ++i) {
+       for (size_t i = 0; i < ((size_t) ci->children_num); ++i) {
                oconfig_item_t *c = ci->children + i;
 
                if (0 == strcasecmp (c->key, "Separator"))
@@ -299,15 +301,14 @@ static int tbl_config_table (oconfig_item_t *ci)
                return status;
        }
 
-       for (i = 0; i < tbl->results_num; ++i) {
+       for (size_t i = 0; i < tbl->results_num; ++i) {
                tbl_result_t *res = tbl->results + i;
-               size_t j;
 
-               for (j = 0; j < res->instances_num; ++j)
+               for (size_t j = 0; j < res->instances_num; ++j)
                        if (res->instances[j] > tbl->max_colnum)
                                tbl->max_colnum = res->instances[j];
 
-               for (j = 0; j < res->values_num; ++j)
+               for (size_t j = 0; j < res->values_num; ++j)
                        if (res->values[j] > tbl->max_colnum)
                                tbl->max_colnum = res->values[j];
        }
@@ -316,9 +317,7 @@ static int tbl_config_table (oconfig_item_t *ci)
 
 static int tbl_config (oconfig_item_t *ci)
 {
-       size_t i;
-
-       for (i = 0; i < ci->children_num; ++i) {
+       for (int i = 0; i < ci->children_num; ++i) {
                oconfig_item_t *c = ci->children + i;
 
                if (0 == strcasecmp (c->key, "Table"))
@@ -335,9 +334,7 @@ static int tbl_config (oconfig_item_t *ci)
 
 static int tbl_prepare (tbl_t *tbl)
 {
-       size_t i;
-
-       for (i = 0; i < tbl->results_num; ++i) {
+       for (size_t i = 0; i < tbl->results_num; ++i) {
                tbl_result_t *res = tbl->results + i;
 
                res->ds = plugin_get_ds (res->type);
@@ -347,9 +344,9 @@ static int tbl_prepare (tbl_t *tbl)
                        return -1;
                }
 
-               if (res->values_num != (size_t)res->ds->ds_num) {
+               if (res->values_num != res->ds->ds_num) {
                        log_err ("Invalid type \"%s\". Expected %zu data source%s, "
-                                       "got %i.", res->type, res->values_num,
+                                       "got %zu.", res->type, res->values_num,
                                        (1 == res->values_num) ? "" : "s",
                                        res->ds->ds_num);
                        return -1;
@@ -360,9 +357,7 @@ static int tbl_prepare (tbl_t *tbl)
 
 static int tbl_finish (tbl_t *tbl)
 {
-       size_t i;
-
-       for (i = 0; i < tbl->results_num; ++i)
+       for (size_t i = 0; i < tbl->results_num; ++i)
                tbl->results[i].ds = NULL;
        return 0;
 } /* tbl_finish */
@@ -373,12 +368,10 @@ static int tbl_result_dispatch (tbl_t *tbl, tbl_result_t *res,
        value_list_t vl = VALUE_LIST_INIT;
        value_t values[res->values_num];
 
-       size_t i;
-
        assert (NULL != res->ds);
        assert (res->values_num == res->ds->ds_num);
 
-       for (i = 0; i < res->values_num; ++i) {
+       for (size_t i = 0; i < res->values_num; ++i) {
                char *value;
 
                assert (res->values[i] < fields_num);
@@ -405,7 +398,7 @@ static int tbl_result_dispatch (tbl_t *tbl, tbl_result_t *res,
                char *instances[res->instances_num];
                char  instances_str[DATA_MAX_NAME_LEN];
 
-               for (i = 0; i < res->instances_num; ++i) {
+               for (size_t i = 0; i < res->instances_num; ++i) {
                        assert (res->instances[i] < fields_num);
                        instances[i] = fields[res->instances[i]];
                }
@@ -437,9 +430,8 @@ static int tbl_parse_line (tbl_t *tbl, char *line, size_t len)
        char *fields[tbl->max_colnum + 1];
        char *ptr, *saveptr;
 
-       size_t i;
+       size_t i = 0;
 
-       i = 0;
        ptr = line;
        saveptr = NULL;
        while (NULL != (fields[i] = strtok_r (ptr, tbl->sep, &saveptr))) {
@@ -451,7 +443,7 @@ static int tbl_parse_line (tbl_t *tbl, char *line, size_t len)
        }
 
        if (i <= tbl->max_colnum) {
-               log_err ("Not enough columns in line "
+               log_warn ("Not enough columns in line "
                                "(expected at least %zu, got %zu).",
                                tbl->max_colnum + 1, i);
                return -1;
@@ -483,11 +475,11 @@ static int tbl_read_table (tbl_t *tbl)
        while (NULL != fgets (buf, sizeof (buf), fh)) {
                if ('\0' != buf[sizeof (buf) - 1]) {
                        buf[sizeof (buf) - 1] = '\0';
-                       log_err ("Table %s: Truncated line: %s", tbl->file, buf);
+                       log_warn ("Table %s: Truncated line: %s", tbl->file, buf);
                }
 
                if (0 != tbl_parse_line (tbl, buf, sizeof (buf))) {
-                       log_err ("Table %s: Failed to parse line: %s", tbl->file, buf);
+                       log_warn ("Table %s: Failed to parse line: %s", tbl->file, buf);
                        continue;
                }
        }
@@ -511,12 +503,11 @@ static int tbl_read_table (tbl_t *tbl)
 static int tbl_read (void)
 {
        int status = -1;
-       size_t i;
 
        if (0 == tables_num)
                return 0;
 
-       for (i = 0; i < tables_num; ++i) {
+       for (size_t i = 0; i < tables_num; ++i) {
                tbl_t *tbl = tables + i;
 
                if (0 != tbl_prepare (tbl)) {
@@ -534,9 +525,7 @@ static int tbl_read (void)
 
 static int tbl_shutdown (void)
 {
-       size_t i;
-
-       for (i = 0; i < tables_num; ++i)
+       for (size_t i = 0; i < tables_num; ++i)
                tbl_clear (&tables[i]);
        sfree (tables);
        return 0;