mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user