static int tbl_config_result(tbl_t *tbl, oconfig_item_t *ci) { if (ci->values_num != 0) { log_err("<Result> does not expect any arguments."); return 1; } tbl_result_t *res = realloc(tbl->results, (tbl->results_num + 1) * sizeof(*tbl->results)); if (res == NULL) { log_err("realloc failed: %s.", STRERRNO); return -1; } tbl->results = res; res = tbl->results + tbl->results_num; tbl_result_setup(res); for (int i = 0; i < ci->children_num; ++i) { oconfig_item_t *c = ci->children + i; if (strcasecmp(c->key, "Type") == 0) cf_util_get_string(c, &res->type); else if (strcasecmp(c->key, "InstancePrefix") == 0) cf_util_get_string(c, &res->instance_prefix); else if (strcasecmp(c->key, "InstancesFrom") == 0) tbl_config_append_array_i(c->key, &res->instances, &res->instances_num, c); else if (strcasecmp(c->key, "ValuesFrom") == 0) tbl_config_append_array_i(c->key, &res->values, &res->values_num, c); else log_warn("Ignoring unknown config key \"%s\" " " in <Result>.", c->key); } int status = 0; if (res->type == NULL) { log_err("No \"Type\" option specified for <Result> in table \"%s\".", tbl->file); status = 1; } if (res->values == NULL) { log_err("No \"ValuesFrom\" option specified for <Result> in table \"%s\".", tbl->file); status = 1; } if (status != 0) { tbl_result_clear(res); return status; } tbl->results_num++; return 0; } /* tbl_config_result */
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) tbl_result_clear (tbl->results + i); sfree (tbl->results); tbl->results_num = 0; tbl->max_colnum = 0; } /* tbl_clear */
static void tbl_clear(tbl_t *tbl) { if (tbl == NULL) { return; } sfree(tbl->file); sfree(tbl->sep); sfree(tbl->plugin_name); sfree(tbl->instance); /* (tbl->results == NULL) -> (tbl->results_num == 0) */ assert((tbl->results != NULL) || (tbl->results_num == 0)); for (size_t i = 0; i < tbl->results_num; ++i) tbl_result_clear(tbl->results + i); sfree(tbl->results); tbl->results_num = 0; tbl->max_colnum = 0; } /* tbl_clear */
static int tbl_config_result (tbl_t *tbl, oconfig_item_t *ci) { tbl_result_t *res; int status = 0; int i; if (0 != ci->values_num) { log_err ("<Result> does not expect any arguments."); return 1; } res = realloc (tbl->results, (tbl->results_num + 1) * sizeof (*tbl->results)); if (res == NULL) { char errbuf[1024]; log_err ("realloc failed: %s.", sstrerror (errno, errbuf, sizeof (errbuf))); return -1; } tbl->results = res; ++tbl->results_num; res = tbl->results + tbl->results_num - 1; tbl_result_setup (res); for (i = 0; i < ci->children_num; ++i) { oconfig_item_t *c = ci->children + i; if (0 == strcasecmp (c->key, "Type")) tbl_config_set_s (c->key, &res->type, c); else if (0 == strcasecmp (c->key, "InstancePrefix")) tbl_config_set_s (c->key, &res->instance_prefix, c); else if (0 == strcasecmp (c->key, "InstancesFrom")) tbl_config_append_array_i (c->key, &res->instances, &res->instances_num, c); else if (0 == strcasecmp (c->key, "ValuesFrom")) tbl_config_append_array_i (c->key, &res->values, &res->values_num, c); else log_warn ("Ignoring unknown config key \"%s\" " " in <Result>.", c->key); } if (NULL == res->type) { log_err ("No \"Type\" option specified for <Result> " "in table \"%s\".", tbl->file); status = 1; } if (NULL == res->values) { log_err ("No \"ValuesFrom\" option specified for <Result> " "in table \"%s\".", tbl->file); status = 1; } if (0 != status) { tbl_result_clear (res); --tbl->results_num; return status; } return 0; } /* tbl_config_result */