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;
char *name;
char *address;
int version;
- int timeout;
+ cdtime_t timeout;
int retries;
/* snmpv1/2 options */
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;
}
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;
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[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[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;
hd->sess_handle = NULL;
hd->interval = 0;
+ /* 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++) {
oconfig_item_t *option = ci->children + i;
status = 0;
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)
sess.community_len = strlen(host->community);
}
- /* Set timeout & retries */
- sess.timeout = host->timeout;
- sess.retries = host->retries;
+ /* Set timeout & retries, if they have been changed from the default */
+ if (host->timeout != 0) {
+ /* net-snmp expects microseconds */
+ sess.timeout = CDTIME_T_TO_US(host->timeout);
+ }
+ if (host->retries >= 0) {
+ sess.retries = host->retries;
+ }
/* snmp_sess_open will copy the `struct snmp_session *'. */
host->sess_handle = snmp_sess_open(&sess);
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);
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 {
}
}
}
- if (dd->invert_match != 0 && is_matched == 0) {
+ if (dd->invert_match && !is_matched) {
sfree(il);
return 0;
}
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) */
snmp_free_pdu(res);
res = NULL;
-
if (status == 0)
csnmp_dispatch_table(host, data, instance_list_head, value_list_head);