* swap plugin: Code for OpenBSD (and possibly other *BSDs) has been
added.
+2009-02-22, Version 4.5.3
+ * build system: The check for libupsclient even when `pkg-config' is
+ not available.
+ * collectd: Fix error handling in the global cache.
+ * Collectd::Unixsock: Error handling has been improved.
+ * ascent plugin: Fix a memory leak. Thanks to Bruno Prémont for his
+ patch.
+ * ipmi plugin: Fix an off-by-one error which could cause segmentation
+ faults. Thanks to Peter Holik for his patch.
+ * tcpconns plugin: An endianness problem has been fixed in the *BSD
+ code. Thanks to "thated" for reporting this.
+
2009-01-02, Version 4.5.2
* build system: Check for `mysql.h' and `mysql/mysql.h', since the
file may be in both locations, especially when the database was
}
else
{
- my $time = $args{'time'} ? $args{'time'} : time ();
+ my $time;
+
+ if ("ARRAY" ne ref ($args{'values'}))
+ {
+ cluck ("Invalid `values' argument (expected an array ref)");
+ return;
+ }
+
+ if (! scalar @{$args{'values'}})
+ {
+ cluck ("Empty `values' array");
+ return;
+ }
+
+ $time = $args{'time'} ? $args{'time'} : time ();
$values = join (':', $time, map { defined ($_) ? $_ : 'U' } (@{$args{'values'}}));
}
exit 0;
}
+sub tokenize {
+ my $line = shift || return;
+ my $line_ptr = $line;
+ my @line = ();
+
+ my $token_pattern = qr/[^"\s]+|"[^"]+"/;
+
+ while (my ($token) = $line_ptr =~ m/^($token_pattern)\s+/) {
+ $line_ptr = $';
+ push @line, $token;
+ }
+
+ if ($line_ptr =~ m/^$token_pattern$/) {
+ push @line, $line_ptr;
+ }
+ else {
+ my ($token) = split m/ /, $line_ptr, 1;
+ print STDERR "Failed to parse line: $line\n";
+ print STDERR "Parse error near token \"$token\".\n";
+ return;
+ }
+
+ foreach my $l (@line) {
+ if ($l =~ m/^"(.*)"$/) {
+ $l = $1;
+ }
+ }
+ return @line;
+}
+
sub getid {
my $string = shift || return;
- print $$string . $/;
my ($h, $p, $pi, $t, $ti) =
- $$string =~ m#^([^/]+)/([^/-]+)(?:-([^/]+))?/([^/-]+)(?:-([^/]+))?\s*#;
- $$string = $';
+ $string =~ m#^([^/]+)/([^/-]+)(?:-([^/]+))?/([^/-]+)(?:-([^/]+))?\s*#;
+ $string = $';
return if ((! $h) || (! $p) || (! $t));
return 1;
} # cmd_help
-=item B<GETVAL> I<Identifier>
+=item B<PUTVAL> I<Identifier> I<Valuelist>
=cut
my $sock = shift || return;
my $line = shift || return;
- my $id = getid(\$line);
+ my @line = tokenize($line);
+
+ my $id;
+ my $ret;
+
+ if (! @line) {
+ return;
+ }
+
+ if (scalar(@line) < 2) {
+ print STDERR "Synopsis: PUTVAL <id> <value0> [<value1> ...]" . $/;
+ return;
+ }
+
+ $id = getid($line[0]);
if (! $id) {
- print STDERR $sock->{'error'} . $/;
+ print STDERR "Invalid id \"$line[0]\"." . $/;
return;
}
my ($time, @values) = split m/:/, $line;
- return $sock->putval(%$id, time => $time, values => \@values);
+ $ret = $sock->putval(%$id, time => $time, values => \@values);
+
+ if (! $ret) {
+ print STDERR "socket error: " . $sock->{'error'} . $/;
+ }
+ return $ret;
}
-=item B<PUTVAL> I<Identifier> I<Valuelist>
+=item B<GETVAL> I<Identifier>
=cut
my $sock = shift || return;
my $line = shift || return;
- my $id = getid(\$line);
+ my @line = tokenize($line);
+
+ my $id;
+ my $vals;
+
+ if (! @line) {
+ return;
+ }
+
+ if (scalar(@line) < 1) {
+ print STDERR "Synopsis: GETVAL <id>" . $/;
+ return;
+ }
+
+ $id = getid($line[0]);
if (! $id) {
- print STDERR $sock->{'error'} . $/;
+ print STDERR "Invalid id \"$line[0]\"." . $/;
return;
}
- my $vals = $sock->getval(%$id);
+ $vals = $sock->getval(%$id);
if (! $vals) {
- print STDERR $sock->{'error'} . $/;
+ print STDERR "socket error: " . $sock->{'error'} . $/;
return;
}
my $sock = shift || return;
my $line = shift;
+ my @line = tokenize($line);
+
my $res;
if (! $line) {
else {
my %args = ();
- foreach my $i (split m/ /, $line) {
+ foreach my $i (@line) {
my ($option, $value) = $i =~ m/^([^=]+)=(.+)$/;
next if (! ($option && $value));
}
if (! $res) {
- print STDERR $sock->{'error'} . $/;
- return;
+ print STDERR "socket error: " . $sock->{'error'} . $/;
}
- return 1;
+ return $res;
}
=item B<LISTVAL>
sub listval {
my $sock = shift || return;
+ my $line = shift;
my @res;
+ if ($line ne "") {
+ print STDERR "Synopsis: LISTVAL" . $/;
+ return;
+ }
+
@res = $sock->listval();
if (! @res) {
- print STDERR $sock->{'error'} . $/;
+ print STDERR "socket error: " . $sock->{'error'} . $/;
return;
}
my $sock = shift || return;
my $line = shift || return;
+ my @line = tokenize($line);
+
+ my $ret;
+
my (%values) = ();
- foreach my $i (split m/ /, $line) {
- my($key,$val) = split m/=/, $i, 2;
+ foreach my $i (@line) {
+ my ($key, $val) = split m/=/, $i, 2;
if ($key && $val) {
$values{$key} = $val;
}
else {
- $values{'message'} .= ' '.$key;
+ $values{'message'} = defined($values{'message'})
+ ? ($values{'message'} . ' ' . $key)
+ : $key;
}
}
$values{'time'} ||= time();
- my(@tmp) = %values;
- return $sock->putnotif(%values);
+
+ $ret = $sock->putnotif(%values);
+ if (! $ret) {
+ print STDERR "socket error: " . $sock->{'error'} . $/;
+ }
+ return $ret;
}
=back
c_ipmi_sensor_list_t *list_item;
c_ipmi_sensor_list_t *list_prev;
+ char buffer[DATA_MAX_NAME_LEN];
+ const char *entity_id_string;
char sensor_name[DATA_MAX_NAME_LEN];
char *sensor_name_ptr;
- int sensor_type, len;
+ int sensor_type;
const char *type;
ipmi_entity_t *ent = ipmi_sensor_get_entity(sensor);
sensor_id = ipmi_sensor_convert_to_id (sensor);
- memset (sensor_name, 0, sizeof (sensor_name));
- ipmi_sensor_get_name (sensor, sensor_name, sizeof (sensor_name));
- sensor_name[sizeof (sensor_name) - 1] = 0;
+ memset (buffer, 0, sizeof (buffer));
+ ipmi_sensor_get_name (sensor, buffer, sizeof (buffer));
+ buffer[sizeof (buffer) - 1] = 0;
- len = DATA_MAX_NAME_LEN - strlen(sensor_name);
- strncat(sensor_name, " ", len--);
- strncat(sensor_name, ipmi_entity_get_entity_id_string(ent), len);
+ entity_id_string = ipmi_entity_get_entity_id_string (ent);
- sensor_name_ptr = strstr (sensor_name, ").");
- if (sensor_name_ptr == NULL)
- sensor_name_ptr = sensor_name;
+ if (entity_id_string == NULL)
+ sstrncpy (sensor_name, buffer, sizeof (sensor_name));
else
- {
- char *sensor_name_ptr_id = strstr (sensor_name, "(");
-
+ ssnprintf (sensor_name, sizeof (sensor_name),
+ "%s %s", buffer, entity_id_string);
+
+ sstrncpy (buffer, sensor_name, sizeof (buffer));
+ sensor_name_ptr = strstr (buffer, ").");
+ if (sensor_name_ptr != NULL)
+ {
+ /* If name is something like "foo (123).bar",
+ * change that to "bar (123)".
+ * Both, sensor_name_ptr and sensor_id_ptr point to memory within the
+ * `buffer' array, which holds a copy of the current `sensor_name'. */
+ char *sensor_id_ptr;
+
+ /* `sensor_name_ptr' points to ").bar". */
+ sensor_name_ptr[1] = 0;
+ /* `buffer' holds "foo (123)\0bar\0". */
sensor_name_ptr += 2;
- len = DATA_MAX_NAME_LEN - strlen(sensor_name);
- strncat(sensor_name, " ", len--);
- strncat(sensor_name, sensor_name_ptr_id,
- MIN(sensor_name_ptr - sensor_name_ptr_id - 1, len));
+ /* `sensor_name_ptr' now points to "bar". */
+
+ sensor_id_ptr = strstr (buffer, "(");
+ if (sensor_id_ptr != NULL)
+ {
+ /* `sensor_id_ptr' now points to "(123)". */
+ ssnprintf (sensor_name, sizeof (sensor_name),
+ "%s %s", sensor_name_ptr, sensor_id_ptr);
+ }
+ /* else: don't touch sensor_name. */
}
+ sensor_name_ptr = sensor_name;
/* Both `ignorelist' and `plugin_instance' may be NULL. */
if (ignorelist_match (ignorelist, sensor_name_ptr) != 0)