autogen: Touch ocaml/.depend
[libguestfs.git] / tools / virt-list-partitions
index b8bc0cc..53059b4 100755 (executable)
@@ -82,6 +82,31 @@ at all.
 
 =cut
 
+my $format;
+
+=item B<--format> raw
+
+Specify the format of disk images given on the command line.  If this
+is omitted then the format is autodetected from the content of the
+disk image.
+
+If disk images are requested from libvirt, then this program asks
+libvirt for this information.  In this case, the value of the format
+parameter is ignored.
+
+If working with untrusted raw-format guest disk images, you should
+ensure the format is always specified.
+
+=cut
+
+my $human;
+
+=item B<-h> | B<--human-readable>
+
+Show sizes in human-readable form (eg. "1G").
+
+=cut
+
 my $long;
 
 =item B<-l> | B<--long>
@@ -91,11 +116,12 @@ and size of each partition too (where "type" means C<ext3>, C<pv> etc.)
 
 =cut
 
-my $human;
+my $total;
 
-=item B<-h> | B<--human-readable>
+=item B<-t> | B<--total>
 
-Show sizes in human-readable form (eg. "1G").
+Display the total size of each block device (as a separate row or
+rows).
 
 =back
 
@@ -107,8 +133,10 @@ Getopt::Long::Configure ("bundling");
 GetOptions ("help|?" => \$help,
             "version" => \$version,
             "connect|c=s" => \$uri,
-            "long|l" => \$long,
+            "format=s" => \$format,
             "human-readable|h" => \$human,
+            "long|l" => \$long,
+            "total|t" => \$total,
     ) or pod2usage (2);
 pod2usage (1) if $help;
 if ($version) {
@@ -123,52 +151,78 @@ pod2usage (__"virt-list-partitions: no image or VM name given")
 
 my $g;
 if ($uri) {
-    $g = open_guest (\@ARGV, address => $uri);
+    $g = open_guest (\@ARGV, address => $uri, format => $format);
 } else {
-    $g = open_guest (\@ARGV);
+    $g = open_guest (\@ARGV, format => $format);
 }
 
 $g->launch ();
 
 # List of partitions and sizes.
-my @partitions;
-my @devices = $g->list_devices ();
-foreach my $dev (@devices) {
-    my @p = $g->part_list ($dev);
-    foreach (@p) {
-        $_->{name} = canonicalize ("$dev" . $_->{part_num});
-        push @partitions, $_;
-    }
-}
+my @partitions = $g->list_partitions ();
+foreach my $name (@partitions) {
+    $name = canonicalize ($name);
 
-# Print them.
-foreach my $part (@partitions) {
-    print $part->{name};
+    print $name;
 
     if ($long) {
         my $type;
         eval {
-            $type = $g->vfs_type ($part->{name});
+            $type = $g->vfs_type ($name);
         };
         $type ||= "unknown";
         $type = "pv" if $type eq "LVM2_member";
         print " $type ";
+
+        my $size;
+        eval {
+            $size = $g->blockdev_getsize64 ($name);
+        };
+        $size ||= "unknown";
+
         if ($human) {
-            print (human_size($part->{part_size}));
+            print (human_size($size));
         } else {
-            print $part->{part_size};
+            print $size;
         }
     }
     print "\n";
 }
 
+if ($total) {
+    # List of devices and sizes.
+    my @devices = $g->list_devices ();
+    foreach my $name (@devices) {
+        $name = canonicalize ($name);
+
+        print $name;
+
+        if ($long) {
+            print " device ";
+
+            my $size;
+            eval {
+                $size = $g->blockdev_getsize64 ($name);
+            };
+            $size ||= "unknown";
+
+            if ($human) {
+                print (human_size($size));
+            } else {
+                print $size;
+            }
+        }
+        print "\n";
+    }
+}
+
 # The reverse of device name translation, see
 # BLOCK DEVICE NAMING in guestfs(3).
 sub canonicalize
 {
     local $_ = shift;
 
-    if (m{^/dev/[hv]d([a-z]\d)$}) {
+    if (m{^/dev/[hv]d([a-z]+\d*)$}) {
         return "/dev/sd$1";
     }
     $_;
@@ -190,6 +244,13 @@ sub human_size
     }
 }
 
+=head1 SHELL QUOTING
+
+Libvirt guest names can contain arbitrary characters, some of which
+have meaning to the shell such as C<#> and space.  You may need to
+quote or escape these characters on the command line.  See the shell
+manual page L<sh(1)> for details.
+
 =head1 SEE ALSO
 
 L<guestfs(3)>,
@@ -203,11 +264,11 @@ L<http://libguestfs.org/>.
 
 =head1 AUTHOR
 
-Richard W.M. Jones L<http://et.redhat.com/~rjones/>
+Richard W.M. Jones L<http://people.redhat.com/~rjones/>
 
 =head1 COPYRIGHT
 
-Copyright (C) 2009 Red Hat Inc.
+Copyright (C) 2009-2010 Red Hat Inc.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by