summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2010-10-18 14:18:58 +0100
committerRichard W.M. Jones <rjones@redhat.com>2010-10-18 14:18:58 +0100
commitf7475ec577b7ca810185e0fd70a39ac9adaae620 (patch)
treebc3d2c0cf5097d8a5051166b40ab623ccb4603bd /tools
parent4d88a74532b20bcb60909c0d0983cdf7498aa08c (diff)
downloadlibguestfs-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-xtools/virt-df32
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