src/utils_cmd_getval.[ch]: Fix handling of identifiers with spaces.
[collectd.git] / bindings / perl / Collectd / Unixsock.pm
index af274a5..d449924 100644 (file)
@@ -175,13 +175,19 @@ sub getval
        my %args = @_;
 
        my $status;
-       my $fh = $obj->{'sock'} or confess;
+       my $fh = $obj->{'sock'} or confess ('object has no filehandle');
        my $msg;
        my $identifier;
 
        my $ret = {};
 
        $identifier = _create_identifier (\%args) or return;
+       if ($identifier =~ m/[\s"]/)
+       {
+               $identifier =~ s#\\#\\\\#g;
+               $identifier =~ s#"#\\"#g;
+               $identifier = "\"$identifier\"";
+       }
 
        $msg = "GETVAL $identifier\n";
        #print "-> $msg";
@@ -236,6 +242,12 @@ sub putval
        my $msg;
        my $identifier;
        my $values;
+       my $interval = "";
+
+       if (defined $args{'interval'})
+       {
+               $interval = ' interval=' . $args{'interval'};
+       }
 
        $identifier = _create_identifier (\%args) or return;
        if (!$args{'values'})
@@ -254,7 +266,7 @@ sub putval
                $values = join (':', $time, map { defined ($_) ? $_ : 'U' } (@{$args{'values'}}));
        }
 
-       $msg = "PUTVAL $identifier $values\n";
+       $msg = "PUTVAL $identifier$interval $values\n";
        #print "-> $msg";
        send ($fh, $msg, 0) or confess ("send: $!");
        $msg = undef;
@@ -471,6 +483,12 @@ sub flush
                        {
                                return;
                        }
+                       if ($ident_str =~ m/[\s"]/)
+                       {
+                               $ident_str =~ s#\\#\\\\#g;
+                               $ident_str =~ s#"#\\"#g;
+                               $ident_str = "\"$ident_str\"";
+                       }
 
                        $msg .= " identifier=$ident_str";
                }