X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fsnmp.c;h=8cb866d30570061fa72aa80bc867f99acaca904d;hp=c74d76563166a5017f7730c722f2445d3159db2d;hb=1159cb5d383c55a80a0db100b8f7aadcf44740a5;hpb=d3abd8fff8c37699daa2a2ac6a9ab3cef4f59f6f diff --git a/src/snmp.c b/src/snmp.c index c74d7656..8cb866d3 100644 --- a/src/snmp.c +++ b/src/snmp.c @@ -63,7 +63,7 @@ struct data_definition_s { struct data_definition_s *next; char **ignores; size_t ignores_len; - int invert_match; + _Bool invert_match; }; typedef struct data_definition_s data_definition_t; @@ -71,7 +71,7 @@ struct host_definition_s { char *name; char *address; int version; - int timeout; + cdtime_t timeout; int retries; /* snmpv1/2 options */ @@ -329,29 +329,14 @@ static int csnmp_config_add_data_blacklist(data_definition_t *dd, return 0; } /* int csnmp_config_add_data_blacklist */ -static int csnmp_config_add_data_blacklist_match_inverted(data_definition_t *dd, - oconfig_item_t *ci) { - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)) { - WARNING("snmp plugin: `InvertMatch' needs exactly one boolean argument."); - return -1; - } - - dd->invert_match = ci->values[0].value.boolean ? 1 : 0; - - return 0; -} /* int csnmp_config_add_data_blacklist_match_inverted */ - static int csnmp_config_add_data(oconfig_item_t *ci) { - data_definition_t *dd; - int status = 0; - - dd = calloc(1, sizeof(*dd)); + data_definition_t *dd = calloc(1, sizeof(*dd)); if (dd == NULL) return -1; - status = cf_util_get_string(ci, &dd->name); + int status = cf_util_get_string(ci, &dd->name); if (status != 0) { - free(dd); + sfree(dd); return -1; } @@ -378,7 +363,7 @@ static int csnmp_config_add_data(oconfig_item_t *ci) { else if (strcasecmp("Ignore", option->key) == 0) status = csnmp_config_add_data_blacklist(dd, option); else if (strcasecmp("InvertMatch", option->key) == 0) - status = csnmp_config_add_data_blacklist_match_inverted(dd, option); + status = cf_util_get_boolean(option, &dd->invert_match); else { WARNING("snmp plugin: Option `%s' not allowed here.", option->key); status = -1; @@ -451,48 +436,6 @@ static int csnmp_config_add_host_version(host_definition_t *hd, return 0; } /* int csnmp_config_add_host_address */ -static int csnmp_config_add_host_timeout(host_definition_t *hd, - oconfig_item_t *ci) { - int timeout; - - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) { - WARNING("snmp plugin: `Timeout' must be a number"); - return -1; - } - - timeout = (int)ci->values[0].value.number; - if (timeout < 0) { - WARNING("snmp plugin: `Timeout' must not be negative"); - return -1; - } - - /* net-snmp library timeout is in microseconds */ - hd->timeout = timeout * 1000000; - - return 0; -} /* int csnmp_config_add_host_timeout */ - -static int csnmp_config_add_host_retries(host_definition_t *hd, - oconfig_item_t *ci) { - int retries; - - - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) { - WARNING("snmp plugin: `Retries' must be a number"); - return -1; - } - - retries = (int)ci->values[0].value.number; - if (retries < 0) { - WARNING("snmp plugin: `Retries' must not be negative"); - return -1; - } - - hd->retries = retries; - - return 0; -} /* int csnmp_config_add_host_retries */ - static int csnmp_config_add_host_collect(host_definition_t *host, oconfig_item_t *ci) { data_definition_t *data; @@ -641,8 +584,8 @@ static int csnmp_config_add_host(oconfig_item_t *ci) { hd->sess_handle = NULL; hd->interval = 0; - /* A negative value means that we have not set a timeout or retry value */ - hd->timeout = -1; + /* These mean that we have not set a timeout or retry value */ + hd->timeout = 0; hd->retries = -1; for (int i = 0; i < ci->children_num; i++) { @@ -656,9 +599,9 @@ static int csnmp_config_add_host(oconfig_item_t *ci) { else if (strcasecmp("Version", option->key) == 0) status = csnmp_config_add_host_version(hd, option); else if (strcasecmp("Timeout", option->key) == 0) - status = csnmp_config_add_host_timeout(hd, option); + cf_util_get_cdtime(option, &hd->timeout); else if (strcasecmp("Retries", option->key) == 0) - status = csnmp_config_add_host_retries(hd, option); + cf_util_get_int(option, &hd->retries); else if (strcasecmp("Collect", option->key) == 0) csnmp_config_add_host_collect(hd, option); else if (strcasecmp("Interval", option->key) == 0) @@ -856,8 +799,9 @@ static void csnmp_host_open_session(host_definition_t *host) { } /* Set timeout & retries, if they have been changed from the default */ - if (host->timeout >= 0) { - sess.timeout = host->timeout; + if (host->timeout != 0) { + /* net-snmp expects microseconds */ + sess.timeout = CDTIME_T_TO_US(host->timeout); } if (host->retries >= 0) { sess.retries = host->retries; @@ -1092,7 +1036,6 @@ static int csnmp_instance_list_add(csnmp_list_instances_t **head, struct variable_list *vb; oid_t vb_name; int status; - uint32_t is_matched; /* Set vb on the last variable */ for (vb = res->variables; (vb != NULL) && (vb->next_variable != NULL); @@ -1122,11 +1065,11 @@ static int csnmp_instance_list_add(csnmp_list_instances_t **head, char *ptr; csnmp_strvbcopy(il->instance, vb, sizeof(il->instance)); - is_matched = 0; + _Bool is_matched = 0; for (uint32_t i = 0; i < dd->ignores_len; i++) { status = fnmatch(dd->ignores[i], il->instance, 0); if (status == 0) { - if (dd->invert_match == 0) { + if (!dd->invert_match) { sfree(il); return 0; } else { @@ -1135,7 +1078,7 @@ static int csnmp_instance_list_add(csnmp_list_instances_t **head, } } } - if (dd->invert_match != 0 && is_matched == 0) { + if (dd->invert_match && !is_matched) { sfree(il); return 0; } @@ -1489,8 +1432,12 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) { for (vb = res->variables, i = 0; (vb != NULL); vb = vb->next_variable, i++) { /* Calculate value index from todo list */ - while ((i < oid_list_len) && !oid_list_todo[i]) + while ((i < oid_list_len) && !oid_list_todo[i]) { i++; + } + if (i >= oid_list_len) { + break; + } /* An instance is configured and the res variable we process is the * instance value (last index) */ @@ -1581,7 +1528,6 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) { snmp_free_pdu(res); res = NULL; - if (status == 0) csnmp_dispatch_table(host, data, instance_list_head, value_list_head);