diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2010-10-18 14:18:58 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2010-10-18 14:18:58 +0100 |
commit | f7475ec577b7ca810185e0fd70a39ac9adaae620 (patch) | |
tree | bc3d2c0cf5097d8a5051166b40ab623ccb4603bd /tools | |
parent | 4d88a74532b20bcb60909c0d0983cdf7498aa08c (diff) | |
download | libguestfs-f7475ec577b7ca810185e0fd70a39ac9adaae620.tar.gz libguestfs-f7475ec577b7ca810185e0fd70a39ac9adaae620.tar.xz libguestfs-f7475ec577b7ca810185e0fd70a39ac9adaae620.zip |
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.
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/virt-df | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/tools/virt-df b/tools/virt-df index 15512216..d9ef8f9a 100755 --- a/tools/virt-df +++ b/tools/virt-df @@ -473,6 +473,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"); } } @@ -491,7 +492,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", @_); } } @@ -509,6 +514,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 |