df: Correctly quote libvirt domain and filesystem in --csv mode (RHBZ#639986).

This fixes virt-df --csv when used with libvirt domains that contain
quotes, spaces, commas and other lesser-used characters.
(cherry picked from commit f7475ec577)
This commit is contained in:
Richard W.M. Jones
2010-10-18 14:18:58 +01:00
parent 09cf74a339
commit edd5f7f737

View File

@@ -282,6 +282,7 @@ sub print_title
printf "%-36s%10s %10s %10s %5s\n",
$cols[1], $cols[2], $cols[3], $cols[4], $cols[5];
} else {
# Columns don't need special CSV quoting.
print (join (",", @cols), "\n");
}
}
@@ -300,7 +301,11 @@ sub print_cols
printf ("%10s %10s %10s %5s\n", $_[2], $_[3], $_[4], $percent);
} else {
printf ("\"%s\",\"%s\",%d,%d,%d,%.1f%%\n", @_);
# Need to quote libvirt domain and filesystem.
my $dom = shift;
my $fs = shift;
print csv_quote($dom), ",", csv_quote($fs), ",";
printf ("%d,%d,%d,%.1f%%\n", @_);
}
}
@@ -318,6 +323,31 @@ sub human_size
}
}
# Quote field for CSV without using an external module.
sub csv_quote
{
local $_ = shift;
my $needs_quoting = /[ ",\n\0]/;
return $_ unless $needs_quoting;
my $i;
my $out = '"';
for ($i = 0; $i < length; ++$i) {
my $c = substr $_, $i, 1;
if ($c eq '"') {
$out .= '""';
} elsif ($c eq '\0') {
$out .= '"0';
} else {
$out .= $c;
}
}
$out .= '"';
return $out;
}
=head1 NOTE ABOUT CSV FORMAT
Comma-separated values (CSV) is a deceptive format. It I<seems> like