projects
/
collectd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #1887 from rubenk/make-xfs-optional
[collectd.git]
/
src
/
snmp.c
diff --git
a/src/snmp.c
b/src/snmp.c
index
8564c68
..
abeda43
100644
(file)
--- a/
src/snmp.c
+++ b/
src/snmp.c
@@
-25,12
+25,11
@@
**/
#include "collectd.h"
**/
#include "collectd.h"
+
#include "common.h"
#include "plugin.h"
#include "utils_complain.h"
#include "common.h"
#include "plugin.h"
#include "utils_complain.h"
-#include <pthread.h>
-
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
@@
-61,7
+60,7
@@
struct data_definition_s
instance_t instance;
char *instance_prefix;
oid_t *values;
instance_t instance;
char *instance_prefix;
oid_t *values;
-
in
t values_len;
+
size_
t values_len;
double scale;
double shift;
struct data_definition_s *next;
double scale;
double shift;
struct data_definition_s *next;
@@
-166,9
+165,8
@@
static int csnmp_oid_to_string (char *buffer, size_t buffer_size,
{
char oid_str[MAX_OID_LEN][16];
char *oid_str_ptr[MAX_OID_LEN];
{
char oid_str[MAX_OID_LEN][16];
char *oid_str_ptr[MAX_OID_LEN];
- size_t i;
- for (i = 0; i < o->oid_len; i++)
+ for (
size_t
i = 0; i < o->oid_len; i++)
{
ssnprintf (oid_str[i], sizeof (oid_str[i]), "%lu", (unsigned long) o->oid[i]);
oid_str_ptr[i] = oid_str[i];
{
ssnprintf (oid_str[i], sizeof (oid_str[i]), "%lu", (unsigned long) o->oid[i]);
oid_str_ptr[i] = oid_str[i];
@@
-293,15
+291,13
@@
static int csnmp_config_add_data_instance_prefix (data_definition_t *dd,
static int csnmp_config_add_data_values (data_definition_t *dd, oconfig_item_t *ci)
{
static int csnmp_config_add_data_values (data_definition_t *dd, oconfig_item_t *ci)
{
- int i;
-
if (ci->values_num < 1)
{
WARNING ("snmp plugin: `Values' needs at least one argument.");
return (-1);
}
if (ci->values_num < 1)
{
WARNING ("snmp plugin: `Values' needs at least one argument.");
return (-1);
}
- for (i = 0; i < ci->values_num; i++)
+ for (i
nt i
= 0; i < ci->values_num; i++)
if (ci->values[i].type != OCONFIG_TYPE_STRING)
{
WARNING ("snmp plugin: `Values' needs only string argument.");
if (ci->values[i].type != OCONFIG_TYPE_STRING)
{
WARNING ("snmp plugin: `Values' needs only string argument.");
@@
-310,12
+306,12
@@
static int csnmp_config_add_data_values (data_definition_t *dd, oconfig_item_t *
sfree (dd->values);
dd->values_len = 0;
sfree (dd->values);
dd->values_len = 0;
- dd->values =
(oid_t *) malloc (sizeof (oid_t
) * ci->values_num);
+ dd->values =
malloc (sizeof (*dd->values
) * ci->values_num);
if (dd->values == NULL)
return (-1);
if (dd->values == NULL)
return (-1);
- dd->values_len = ci->values_num;
+ dd->values_len =
(size_t)
ci->values_num;
- for (i = 0; i < ci->values_num; i++)
+ for (i
nt i
= 0; i < ci->values_num; i++)
{
dd->values[i].oid_len = MAX_OID_LEN;
{
dd->values[i].oid_len = MAX_OID_LEN;
@@
-336,12
+332,10
@@
static int csnmp_config_add_data_values (data_definition_t *dd, oconfig_item_t *
static int csnmp_config_add_data_blacklist(data_definition_t *dd, oconfig_item_t *ci)
{
static int csnmp_config_add_data_blacklist(data_definition_t *dd, oconfig_item_t *ci)
{
- int i;
-
if (ci->values_num < 1)
return (0);
if (ci->values_num < 1)
return (0);
- for (i = 0; i < ci->values_num; i++)
+ for (i
nt i
= 0; i < ci->values_num; i++)
{
if (ci->values[i].type != OCONFIG_TYPE_STRING)
{
{
if (ci->values[i].type != OCONFIG_TYPE_STRING)
{
@@
-353,7
+347,7
@@
static int csnmp_config_add_data_blacklist(data_definition_t *dd, oconfig_item_t
dd->ignores_len = 0;
dd->ignores = NULL;
dd->ignores_len = 0;
dd->ignores = NULL;
- for (i = 0; i < ci->values_num; ++i)
+ for (i
nt i
= 0; i < ci->values_num; ++i)
{
if (strarray_add(&(dd->ignores), &(dd->ignores_len), ci->values[i].value.string) != 0)
{
{
if (strarray_add(&(dd->ignores), &(dd->ignores_len), ci->values[i].value.string) != 0)
{
@@
-382,12
+376,10
@@
static int csnmp_config_add_data (oconfig_item_t *ci)
{
data_definition_t *dd;
int status = 0;
{
data_definition_t *dd;
int status = 0;
- int i;
- dd =
(data_definition_t *) malloc (sizeof (data_definition_t
));
+ dd =
calloc (1, sizeof (*dd
));
if (dd == NULL)
return (-1);
if (dd == NULL)
return (-1);
- memset (dd, '\0', sizeof (data_definition_t));
status = cf_util_get_string(ci, &dd->name);
if (status != 0)
status = cf_util_get_string(ci, &dd->name);
if (status != 0)
@@
-399,7
+391,7
@@
static int csnmp_config_add_data (oconfig_item_t *ci)
dd->scale = 1.0;
dd->shift = 0.0;
dd->scale = 1.0;
dd->shift = 0.0;
- for (i = 0; i < ci->children_num; i++)
+ for (i
nt i
= 0; i < ci->children_num; i++)
{
oconfig_item_t *option = ci->children + i;
{
oconfig_item_t *option = ci->children + i;
@@
-459,7
+451,7
@@
static int csnmp_config_add_data (oconfig_item_t *ci)
return (-1);
}
return (-1);
}
- DEBUG ("snmp plugin: dd = { name = %s, type = %s, is_table = %s, values_len = %
i
}",
+ DEBUG ("snmp plugin: dd = { name = %s, type = %s, is_table = %s, values_len = %
zu
}",
dd->name, dd->type, (dd->is_table != 0) ? "true" : "false", dd->values_len);
if (data_head == NULL)
dd->name, dd->type, (dd->is_table != 0) ? "true" : "false", dd->values_len);
if (data_head == NULL)
@@
-505,7
+497,6
@@
static int csnmp_config_add_host_collect (host_definition_t *host,
data_definition_t *data;
data_definition_t **data_list;
int data_list_len;
data_definition_t *data;
data_definition_t **data_list;
int data_list_len;
- int i;
if (ci->values_num < 1)
{
if (ci->values_num < 1)
{
@@
-513,7
+504,7
@@
static int csnmp_config_add_host_collect (host_definition_t *host,
return (-1);
}
return (-1);
}
- for (i = 0; i < ci->values_num; i++)
+ for (i
nt i
= 0; i < ci->values_num; i++)
if (ci->values[i].type != OCONFIG_TYPE_STRING)
{
WARNING ("snmp plugin: All arguments to `Collect' must be strings.");
if (ci->values[i].type != OCONFIG_TYPE_STRING)
{
WARNING ("snmp plugin: All arguments to `Collect' must be strings.");
@@
-521,13
+512,13
@@
static int csnmp_config_add_host_collect (host_definition_t *host,
}
data_list_len = host->data_list_len + ci->values_num;
}
data_list_len = host->data_list_len + ci->values_num;
- data_list =
(data_definition_t **)
realloc (host->data_list,
+ data_list = realloc (host->data_list,
sizeof (data_definition_t *) * data_list_len);
if (data_list == NULL)
return (-1);
host->data_list = data_list;
sizeof (data_definition_t *) * data_list_len);
if (data_list == NULL)
return (-1);
host->data_list = data_list;
- for (i = 0; i < ci->values_num; i++)
+ for (i
nt i
= 0; i < ci->values_num; i++)
{
for (data = data_head; data != NULL; data = data->next)
if (strcasecmp (ci->values[i].value.string, data->name) == 0)
{
for (data = data_head; data != NULL; data = data->next)
if (strcasecmp (ci->values[i].value.string, data->name) == 0)
@@
-640,28
+631,27
@@
static int csnmp_config_add_host (oconfig_item_t *ci)
{
host_definition_t *hd;
int status = 0;
{
host_definition_t *hd;
int status = 0;
- int i;
/* Registration stuff. */
char cb_name[DATA_MAX_NAME_LEN];
/* Registration stuff. */
char cb_name[DATA_MAX_NAME_LEN];
- user_data_t cb_data;
- struct timespec cb_interval;
- hd =
(host_definition_t *) malloc (sizeof (host_definition_t
));
+ hd =
calloc (1, sizeof (*hd
));
if (hd == NULL)
return (-1);
if (hd == NULL)
return (-1);
- memset (hd, '\0', sizeof (host_definition_t));
hd->version = 2;
C_COMPLAIN_INIT (&hd->complaint);
status = cf_util_get_string(ci, &hd->name);
if (status != 0)
hd->version = 2;
C_COMPLAIN_INIT (&hd->complaint);
status = cf_util_get_string(ci, &hd->name);
if (status != 0)
+ {
+ sfree (hd);
return status;
return status;
+ }
hd->sess_handle = NULL;
hd->interval = 0;
hd->sess_handle = NULL;
hd->interval = 0;
- for (i = 0; i < ci->children_num; i++)
+ for (i
nt i
= 0; i < ci->children_num; i++)
{
oconfig_item_t *option = ci->children + i;
status = 0;
{
oconfig_item_t *option = ci->children + i;
status = 0;
@@
-774,15
+764,13
@@
static int csnmp_config_add_host (oconfig_item_t *ci)
ssnprintf (cb_name, sizeof (cb_name), "snmp-%s", hd->name);
ssnprintf (cb_name, sizeof (cb_name), "snmp-%s", hd->name);
- memset (&cb_data, 0, sizeof (cb_data));
- cb_data.data = hd;
- cb_data.free_func = csnmp_host_definition_destroy;
-
- CDTIME_T_TO_TIMESPEC (hd->interval, &cb_interval);
+ user_data_t ud = {
+ .data = hd,
+ .free_func = csnmp_host_definition_destroy
+ };
status = plugin_register_complex_read (/* group = */ NULL, cb_name,
status = plugin_register_complex_read (/* group = */ NULL, cb_name,
- csnmp_read_host, /* interval = */ &cb_interval,
- /* user_data = */ &cb_data);
+ csnmp_read_host, hd->interval, /* user_data = */ &ud);
if (status != 0)
{
ERROR ("snmp plugin: Registering complex read function failed.");
if (status != 0)
{
ERROR ("snmp plugin: Registering complex read function failed.");
@@
-795,11
+783,9
@@
static int csnmp_config_add_host (oconfig_item_t *ci)
static int csnmp_config (oconfig_item_t *ci)
{
static int csnmp_config (oconfig_item_t *ci)
{
- int i;
-
call_snmp_init_once ();
call_snmp_init_once ();
- for (i = 0; i < ci->children_num; i++)
+ for (i
nt i
= 0; i < ci->children_num; i++)
{
oconfig_item_t *child = ci->children + i;
if (strcasecmp ("Data", child->key) == 0)
{
oconfig_item_t *child = ci->children + i;
if (strcasecmp ("Data", child->key) == 0)
@@
-928,8
+914,7
@@
static value_t csnmp_value_list_to_value (struct variable_list *vl, int type,
tmp_unsigned = (uint32_t) *vl->val.integer;
tmp_signed = (int32_t) *vl->val.integer;
tmp_unsigned = (uint32_t) *vl->val.integer;
tmp_signed = (int32_t) *vl->val.integer;
- if ((vl->type == ASN_INTEGER)
- || (vl->type == ASN_GAUGE))
+ if (vl->type == ASN_INTEGER)
prefer_signed = 1;
DEBUG ("snmp plugin: Parsed int32 value is %"PRIu64".", tmp_unsigned);
prefer_signed = 1;
DEBUG ("snmp plugin: Parsed int32 value is %"PRIu64".", tmp_unsigned);
@@
-948,9
+933,8
@@
static value_t csnmp_value_list_to_value (struct variable_list *vl, int type,
}
else
{
}
else
{
- char oid_buffer[1024];
+ char oid_buffer[1024]
= { 0 }
;
- memset (oid_buffer, 0, sizeof (oid_buffer));
snprint_objid (oid_buffer, sizeof (oid_buffer) - 1,
vl->name, vl->name_length);
snprint_objid (oid_buffer, sizeof (oid_buffer) - 1,
vl->name, vl->name_length);
@@
-1053,50
+1037,67
@@
static value_t csnmp_value_list_to_value (struct variable_list *vl, int type,
return (ret);
} /* value_t csnmp_value_list_to_value */
return (ret);
} /* value_t csnmp_value_list_to_value */
+/* csnmp_strvbcopy_hexstring converts the bit string contained in "vb" to a hex
+ * representation and writes it to dst. Returns zero on success and ENOMEM if
+ * dst is not large enough to hold the string. dst is guaranteed to be
+ * nul-terminated. */
static int csnmp_strvbcopy_hexstring (char *dst, /* {{{ */
const struct variable_list *vb, size_t dst_size)
{
char *buffer_ptr;
size_t buffer_free;
static int csnmp_strvbcopy_hexstring (char *dst, /* {{{ */
const struct variable_list *vb, size_t dst_size)
{
char *buffer_ptr;
size_t buffer_free;
- size_t i;
+
+ dst[0] = 0;
buffer_ptr = dst;
buffer_free = dst_size;
buffer_ptr = dst;
buffer_free = dst_size;
- for (i = 0; i < vb->val_len; i++)
+ for (
size_t
i = 0; i < vb->val_len; i++)
{
int status;
status = snprintf (buffer_ptr, buffer_free,
(i == 0) ? "%02x" : ":%02x", (unsigned int) vb->val.bitstring[i]);
{
int status;
status = snprintf (buffer_ptr, buffer_free,
(i == 0) ? "%02x" : ":%02x", (unsigned int) vb->val.bitstring[i]);
+ assert (status >= 0);
- if (
status >= buffer_free)
+ if (
((size_t) status) >= buffer_free) /* truncated */
{
{
- buffer_ptr += (buffer_free - 1);
- *buffer_ptr = 0;
- return (dst_size + (buffer_free - status));
+ dst[dst_size - 1] = 0;
+ return ENOMEM;
}
else /* if (status < buffer_free) */
{
}
else /* if (status < buffer_free) */
{
- buffer_ptr
+=
status;
- buffer_free -= status;
+ buffer_ptr
+= (size_t)
status;
+ buffer_free -=
(size_t)
status;
}
}
}
}
- return
((int) (dst_size - buffer_free))
;
+ return
0
;
} /* }}} int csnmp_strvbcopy_hexstring */
} /* }}} int csnmp_strvbcopy_hexstring */
+/* csnmp_strvbcopy copies the octet string or bit string contained in vb to
+ * dst. If non-printable characters are detected, it will switch to a hex
+ * representation of the string. Returns zero on success, EINVAL if vb does not
+ * contain a string and ENOMEM if dst is not large enough to contain the
+ * string. */
static int csnmp_strvbcopy (char *dst, /* {{{ */
const struct variable_list *vb, size_t dst_size)
{
char *src;
size_t num_chars;
static int csnmp_strvbcopy (char *dst, /* {{{ */
const struct variable_list *vb, size_t dst_size)
{
char *src;
size_t num_chars;
- size_t i;
if (vb->type == ASN_OCTET_STR)
src = (char *) vb->val.string;
else if (vb->type == ASN_BIT_STR)
src = (char *) vb->val.bitstring;
if (vb->type == ASN_OCTET_STR)
src = (char *) vb->val.string;
else if (vb->type == ASN_BIT_STR)
src = (char *) vb->val.bitstring;
+ else if (vb->type == ASN_IPADDRESS)
+ {
+ return ssnprintf (dst, dst_size, "%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8"",
+ (uint8_t) vb->val.string[0],
+ (uint8_t) vb->val.string[1],
+ (uint8_t) vb->val.string[2],
+ (uint8_t) vb->val.string[3]);
+ }
else
{
dst[0] = 0;
else
{
dst[0] = 0;
@@
-1107,7
+1108,7
@@
static int csnmp_strvbcopy (char *dst, /* {{{ */
if (num_chars > vb->val_len)
num_chars = vb->val_len;
if (num_chars > vb->val_len)
num_chars = vb->val_len;
- for (i = 0; i < num_chars; i++)
+ for (
size_t
i = 0; i < num_chars; i++)
{
/* Check for control characters. */
if ((unsigned char)src[i] < 32)
{
/* Check for control characters. */
if ((unsigned char)src[i] < 32)
@@
-1115,8
+1116,12
@@
static int csnmp_strvbcopy (char *dst, /* {{{ */
dst[i] = src[i];
}
dst[num_chars] = 0;
dst[i] = src[i];
}
dst[num_chars] = 0;
+ dst[dst_size - 1] = 0;
- return ((int) vb->val_len);
+ if (dst_size <= vb->val_len)
+ return ENOMEM;
+
+ return 0;
} /* }}} int csnmp_strvbcopy */
static int csnmp_instance_list_add (csnmp_list_instances_t **head,
} /* }}} int csnmp_strvbcopy */
static int csnmp_instance_list_add (csnmp_list_instances_t **head,
@@
-1128,7
+1133,6
@@
static int csnmp_instance_list_add (csnmp_list_instances_t **head,
struct variable_list *vb;
oid_t vb_name;
int status;
struct variable_list *vb;
oid_t vb_name;
int status;
- uint32_t i;
uint32_t is_matched;
/* Set vb on the last variable */
uint32_t is_matched;
/* Set vb on the last variable */
@@
-1141,13
+1145,12
@@
static int csnmp_instance_list_add (csnmp_list_instances_t **head,
csnmp_oid_init (&vb_name, vb->name, vb->name_length);
csnmp_oid_init (&vb_name, vb->name, vb->name_length);
- il =
malloc (
sizeof (*il));
+ il =
calloc (1,
sizeof (*il));
if (il == NULL)
{
if (il == NULL)
{
- ERROR ("snmp plugin:
m
alloc failed.");
+ ERROR ("snmp plugin:
c
alloc failed.");
return (-1);
}
return (-1);
}
- memset (il, 0, sizeof (*il));
il->next = NULL;
status = csnmp_oid_suffix (&il->suffix, &vb_name, &dd->instance.oid);
il->next = NULL;
status = csnmp_oid_suffix (&il->suffix, &vb_name, &dd->instance.oid);
@@
-1158,13
+1161,13
@@
static int csnmp_instance_list_add (csnmp_list_instances_t **head,
}
/* Get instance name */
}
/* Get instance name */
- if ((vb->type == ASN_OCTET_STR) || (vb->type == ASN_BIT_STR))
+ if ((vb->type == ASN_OCTET_STR) || (vb->type == ASN_BIT_STR)
|| (vb->type == ASN_IPADDRESS)
)
{
char *ptr;
csnmp_strvbcopy (il->instance, vb, sizeof (il->instance));
is_matched = 0;
{
char *ptr;
csnmp_strvbcopy (il->instance, vb, sizeof (il->instance));
is_matched = 0;
- for (i = 0; i < dd->ignores_len; i++)
+ for (
uint32_t
i = 0; i < dd->ignores_len; i++)
{
status = fnmatch(dd->ignores[i], il->instance, 0);
if (status == 0)
{
status = fnmatch(dd->ignores[i], il->instance, 0);
if (status == 0)
@@
-1224,7
+1227,7
@@
static int csnmp_dispatch_table (host_definition_t *host, data_definition_t *dat
csnmp_list_instances_t *instance_list_ptr;
csnmp_table_values_t **value_table_ptr;
csnmp_list_instances_t *instance_list_ptr;
csnmp_table_values_t **value_table_ptr;
-
in
t i;
+
size_
t i;
_Bool have_more;
oid_t current_suffix;
_Bool have_more;
oid_t current_suffix;
@@
-1239,7
+1242,7
@@
static int csnmp_dispatch_table (host_definition_t *host, data_definition_t *dat
instance_list_ptr = instance_list;
instance_list_ptr = instance_list;
- value_table_ptr = calloc (
(size_t)
data->values_len, sizeof (*value_table_ptr));
+ value_table_ptr = calloc (data->values_len, sizeof (*value_table_ptr));
if (value_table_ptr == NULL)
return (-1);
for (i = 0; i < data->values_len; i++)
if (value_table_ptr == NULL)
return (-1);
for (i = 0; i < data->values_len; i++)
@@
-1260,7
+1263,6
@@
static int csnmp_dispatch_table (host_definition_t *host, data_definition_t *dat
vl.interval = host->interval;
have_more = 1;
vl.interval = host->interval;
have_more = 1;
- memset (¤t_suffix, 0, sizeof (current_suffix));
while (have_more)
{
_Bool suffix_skipped = 0;
while (have_more)
{
_Bool suffix_skipped = 0;
@@
-1359,8
+1361,12
@@
static int csnmp_dispatch_table (host_definition_t *host, data_definition_t *dat
for (i = 0; i < data->values_len; i++)
vl.values[i] = value_table_ptr[i]->value;
for (i = 0; i < data->values_len; i++)
vl.values[i] = value_table_ptr[i]->value;
- /* If we get here `vl.type_instance' and all `vl.values' have been set */
- plugin_dispatch_values (&vl);
+ /* If we get here `vl.type_instance' and all `vl.values' have been set
+ * vl.type_instance can be empty, i.e. a blank port description on a
+ * switch if you're using IF-MIB::ifDescr as Instance.
+ */
+ if (vl.type_instance[0] != '\0')
+ plugin_dispatch_values (&vl);
if (instance_list != NULL)
instance_list_ptr = instance_list_ptr->next;
if (instance_list != NULL)
instance_list_ptr = instance_list_ptr->next;
@@
-1377,12
+1383,12
@@
static int csnmp_dispatch_table (host_definition_t *host, data_definition_t *dat
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
{
struct snmp_pdu *req;
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
{
struct snmp_pdu *req;
- struct snmp_pdu *res;
+ struct snmp_pdu *res
= NULL
;
struct variable_list *vb;
const data_set_t *ds;
struct variable_list *vb;
const data_set_t *ds;
-
uint32_t oid_list_len = (uint32_t) (data->values_len + 1)
;
+
size_t oid_list_len = data->values_len + 1
;
/* Holds the last OID returned by the device. We use this in the GETNEXT
* request to proceed. */
oid_t oid_list[oid_list_len];
/* Holds the last OID returned by the device. We use this in the GETNEXT
* request to proceed. */
oid_t oid_list[oid_list_len];
@@
-1391,8
+1397,7
@@
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
_Bool oid_list_todo[oid_list_len];
int status;
_Bool oid_list_todo[oid_list_len];
int status;
- int i;
- uint32_t j;
+ size_t i;
/* `value_list_head' and `value_list_tail' implement a linked list for each
* value. `instance_list_head' and `instance_list_tail' implement a linked list of
/* `value_list_head' and `value_list_tail' implement a linked list for each
* value. `instance_list_head' and `instance_list_tail' implement a linked list of
@@
-1420,7
+1425,7
@@
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
if (ds->ds_num != data->values_len)
{
if (ds->ds_num != data->values_len)
{
- ERROR ("snmp plugin: DataSet `%s' requires %
i values, but config talks about %i
",
+ ERROR ("snmp plugin: DataSet `%s' requires %
zu values, but config talks about %zu
",
data->type, ds->ds_num, data->values_len);
return (-1);
}
data->type, ds->ds_num, data->values_len);
return (-1);
}
@@
-1433,8
+1438,8
@@
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
else /* no InstanceFrom option specified. */
oid_list_len--;
else /* no InstanceFrom option specified. */
oid_list_len--;
- for (
j = 0; j < oid_list_len; j
++)
- oid_list_todo[
j
] = 1;
+ for (
i = 0; i < oid_list_len; i
++)
+ oid_list_todo[
i
] = 1;
/* We're going to construct n linked lists, one for each "value".
* value_list_head will contain pointers to the heads of these linked lists,
/* We're going to construct n linked lists, one for each "value".
* value_list_head will contain pointers to the heads of these linked lists,
@@
-1466,13
+1471,13
@@
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
}
oid_list_todo_num = 0;
}
oid_list_todo_num = 0;
- for (
j = 0; j < oid_list_len; j
++)
+ for (
i = 0; i < oid_list_len; i
++)
{
/* Do not rerequest already finished OIDs */
{
/* Do not rerequest already finished OIDs */
- if (!oid_list_todo[
j
])
+ if (!oid_list_todo[
i
])
continue;
oid_list_todo_num++;
continue;
oid_list_todo_num++;
- snmp_add_null_var (req, oid_list[
j].oid, oid_list[j
].oid_len);
+ snmp_add_null_var (req, oid_list[
i].oid, oid_list[i
].oid_len);
}
if (oid_list_todo_num == 0)
}
if (oid_list_todo_num == 0)
@@
-1568,7
+1573,7
@@
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
ret = csnmp_oid_suffix (&suffix, &vb_name, data->values + i);
if (ret != 0)
{
ret = csnmp_oid_suffix (&suffix, &vb_name, data->values + i);
if (ret != 0)
{
- DEBUG ("snmp plugin: host = %s; data = %s; i = %
i
; "
+ DEBUG ("snmp plugin: host = %s; data = %s; i = %
zu
; "
"Value probably left its subtree.",
host->name, data->name, i);
oid_list_todo[i] = 0;
"Value probably left its subtree.",
host->name, data->name, i);
oid_list_todo[i] = 0;
@@
-1580,21
+1585,20
@@
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
if ((value_list_tail[i] != NULL)
&& (csnmp_oid_compare (&suffix, &value_list_tail[i]->suffix) <= 0))
{
if ((value_list_tail[i] != NULL)
&& (csnmp_oid_compare (&suffix, &value_list_tail[i]->suffix) <= 0))
{
- DEBUG ("snmp plugin: host = %s; data = %s; i = %
i
; "
+ DEBUG ("snmp plugin: host = %s; data = %s; i = %
zu
; "
"Suffix is not increasing.",
host->name, data->name, i);
oid_list_todo[i] = 0;
continue;
}
"Suffix is not increasing.",
host->name, data->name, i);
oid_list_todo[i] = 0;
continue;
}
- vt =
malloc (
sizeof (*vt));
+ vt =
calloc (1,
sizeof (*vt));
if (vt == NULL)
{
if (vt == NULL)
{
- ERROR ("snmp plugin:
m
alloc failed.");
+ ERROR ("snmp plugin:
c
alloc failed.");
status = -1;
break;
}
status = -1;
break;
}
- memset (vt, 0, sizeof (*vt));
vt->value = csnmp_value_list_to_value (vb, ds->ds[i].type,
data->scale, data->shift, host->name, data->name);
vt->value = csnmp_value_list_to_value (vb, ds->ds[i].type,
data->scale, data->shift, host->name, data->name);
@@
-1657,21
+1661,21
@@
static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
static int csnmp_read_value (host_definition_t *host, data_definition_t *data)
{
struct snmp_pdu *req;
static int csnmp_read_value (host_definition_t *host, data_definition_t *data)
{
struct snmp_pdu *req;
- struct snmp_pdu *res;
+ struct snmp_pdu *res
= NULL
;
struct variable_list *vb;
const data_set_t *ds;
value_list_t vl = VALUE_LIST_INIT;
int status;
struct variable_list *vb;
const data_set_t *ds;
value_list_t vl = VALUE_LIST_INIT;
int status;
-
in
t i;
+
size_
t i;
DEBUG ("snmp plugin: csnmp_read_value (host = %s, data = %s)",
host->name, data->name);
if (host->sess_handle == NULL)
{
DEBUG ("snmp plugin: csnmp_read_value (host = %s, data = %s)",
host->name, data->name);
if (host->sess_handle == NULL)
{
- DEBUG ("snmp plugin: csnmp_read_
tabl
e: host->sess_handle == NULL");
+ DEBUG ("snmp plugin: csnmp_read_
valu
e: host->sess_handle == NULL");
return (-1);
}
return (-1);
}
@@
-1684,13
+1688,13
@@
static int csnmp_read_value (host_definition_t *host, data_definition_t *data)
if (ds->ds_num != data->values_len)
{
if (ds->ds_num != data->values_len)
{
- ERROR ("snmp plugin: DataSet `%s' requires %
i values, but config talks about %i
",
+ ERROR ("snmp plugin: DataSet `%s' requires %
zu values, but config talks about %zu
",
data->type, ds->ds_num, data->values_len);
return (-1);
}
vl.values_len = ds->ds_num;
data->type, ds->ds_num, data->values_len);
return (-1);
}
vl.values_len = ds->ds_num;
- vl.values =
(value_t *) malloc (sizeof (value_t
) * vl.values_len);
+ vl.values =
malloc (sizeof (*vl.values
) * vl.values_len);
if (vl.values == NULL)
return (-1);
for (i = 0; i < vl.values_len; i++)
if (vl.values == NULL)
return (-1);
for (i = 0; i < vl.values_len; i++)
@@
-1719,7
+1723,6
@@
static int csnmp_read_value (host_definition_t *host, data_definition_t *data)
for (i = 0; i < data->values_len; i++)
snmp_add_null_var (req, data->values[i].oid, data->values[i].oid_len);
for (i = 0; i < data->values_len; i++)
snmp_add_null_var (req, data->values[i].oid, data->values[i].oid_len);
- res = NULL;
status = snmp_sess_synch_response (host->sess_handle, req, &res);
if ((status != STAT_SUCCESS) || (res == NULL))
status = snmp_sess_synch_response (host->sess_handle, req, &res);
if ((status != STAT_SUCCESS) || (res == NULL))
@@
-1732,9
+1735,9
@@
static int csnmp_read_value (host_definition_t *host, data_definition_t *data)
if (res != NULL)
snmp_free_pdu (res);
if (res != NULL)
snmp_free_pdu (res);
- res = NULL;
sfree (errstr);
sfree (errstr);
+ sfree (vl.values);
csnmp_host_close_session (host);
return (-1);
csnmp_host_close_session (host);
return (-1);
@@
-1757,9
+1760,7
@@
static int csnmp_read_value (host_definition_t *host, data_definition_t *data)
data->scale, data->shift, host->name, data->name);
} /* for (res->variables) */
data->scale, data->shift, host->name, data->name);
} /* for (res->variables) */
- if (res != NULL)
- snmp_free_pdu (res);
- res = NULL;
+ snmp_free_pdu (res);
DEBUG ("snmp plugin: -> plugin_dispatch_values (&vl);");
plugin_dispatch_values (&vl);
DEBUG ("snmp plugin: -> plugin_dispatch_values (&vl);");
plugin_dispatch_values (&vl);
@@
-1771,8
+1772,6
@@
static int csnmp_read_value (host_definition_t *host, data_definition_t *data)
static int csnmp_read_host (user_data_t *ud)
{
host_definition_t *host;
static int csnmp_read_host (user_data_t *ud)
{
host_definition_t *host;
- cdtime_t time_start;
- cdtime_t time_end;
int status;
int success;
int i;
int status;
int success;
int i;
@@
-1782,8
+1781,6
@@
static int csnmp_read_host (user_data_t *ud)
if (host->interval == 0)
host->interval = plugin_get_interval ();
if (host->interval == 0)
host->interval = plugin_get_interval ();
- time_start = cdtime ();
-
if (host->sess_handle == NULL)
csnmp_host_open_session (host);
if (host->sess_handle == NULL)
csnmp_host_open_session (host);
@@
-1804,16
+1801,6
@@
static int csnmp_read_host (user_data_t *ud)
success++;
}
success++;
}
- time_end = cdtime ();
- if ((time_end - time_start) > host->interval)
- {
- WARNING ("snmp plugin: Host `%s' should be queried every %.3f "
- "seconds, but reading all values takes %.3f seconds.",
- host->name,
- CDTIME_T_TO_DOUBLE (host->interval),
- CDTIME_T_TO_DOUBLE (time_end - time_start));
- }
-
if (success == 0)
return (-1);
if (success == 0)
return (-1);