$status = B<RRD::end>
-B<$RRDp::user>, B<$RRDp::sys>, B<$RRDp::real>
+B<$RRDp::user>, B<$RRDp::sys>, B<$RRDp::real>, B<$RRDp::error_mode>, B<$RRDp::error>
=head1 DESCRIPTION
waiting for things like the hard disk and new input from the perl
script.
+=item B<$RRDp::error_mode> and B<$RRDp::error>
+
+If you set the variable $RRDp::error_mode to the value 'catch' before you run RRDp::read a potential
+ERROR message will not cause the program to abort but will be returned in this variable. If no error
+occurs the variable will be empty.
+
+ $RRDp::error_mode = 'catch';
+ RRDp::cmd qw(info file.rrd);
+ print $RRDp::error if $RRDp::error;
+
=back
=head1 AUTHOR
-Tobias Oetiker <oetiker@ee.ethz.ch>
+Tobias Oetiker <tobi@oetiker.ch>
=cut
#' this is to make cperl.el happy
sub end ();
sub read ();
-$VERSION=1.199905;
+$VERSION=1.3000;
sub start ($){
croak "rrdtool is already running"
sub read () {
croak "RRDp::read can only be called after RRDp::cmd"
unless $Sequence eq 'C';
+ $RRDp::error = undef;
$Sequence = 'R';
my $inmask = 0;
my $srbuf;
my $buffer;
my $nfound;
my $timeleft;
- my $ERR = 0;
vec($inmask,fileno(RRDreadHand),1) = 1; # setup select mask for Reader
while (1) {
my $rout;
$minibuf .= $srbuf;
while ($minibuf =~ s|^(.+?)\n||s) {
my $line = $1;
- # print $line,"\n";
- if ($line =~ m|^ERROR|) {
- croak $line;
- $ERR = 1;
+ # print $line,"\n";
+ $RRDp::error = undef;
+ if ($line =~ m|^ERROR|) {
+ $RRDp::error_mode eq 'catch' ? $RRDp::error = $line : croak $line;
+ $RRDp::sys = undef;
+ $RRDp::user = undef;
+ $RRDp::real = undef;
+ return undef;
}
- elsif ($line =~ m|^OK u:([\d\.]+) s:([\d\.]+) r:([\d\.]+)|){
+ elsif ($line =~ m|^OK(?: u:([\d\.]+) s:([\d\.]+) r:([\d\.]+))?|){
($RRDp::sys,$RRDp::user,$RRDp::real)=($1,$2,$3);
- return $ERR == 1 ? undef : \$buffer;
+ return \$buffer;
} else {
$buffer .= $line. "\n";
}