Update FSF address.
[libguestfs.git] / tools / virt-list-partitions
index b8bc0cc..3b8ee4b 100755 (executable)
@@ -14,7 +14,7 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 use warnings;
 use strict;
@@ -39,6 +39,9 @@ virt-list-partitions - List partitions in a virtual machine or disk image
 
 =head1 DESCRIPTION
 
+This tool is obsolete.  Use L<virt-filesystems(1)> as a more
+flexible replacement.
+
 C<virt-list-partitions> is a command line tool to list
 the partitions that are contained in a virtual machine or
 disk image.  It is mainly useful as a first step to using
@@ -72,7 +75,9 @@ Display version number and exit.
 
 my $uri;
 
-=item B<--connect URI> | B<-c URI>
+=item B<-c URI>
+
+=item B<--connect URI>
 
 If using libvirt, connect to the given I<URI>.  If omitted, then we
 connect to the default libvirt hypervisor.
@@ -82,20 +87,52 @@ 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>
+
+=item B<--human-readable>
+
+Show sizes in human-readable form (eg. "1G").
+
+=cut
+
 my $long;
 
-=item B<-l> | B<--long>
+=item B<-l>
+
+=item B<--long>
 
 With this option, C<virt-list-partitions> displays the type
 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>
 
-Show sizes in human-readable form (eg. "1G").
+=item B<--total>
+
+Display the total size of each block device (as a separate row or
+rows).
 
 =back
 
@@ -107,8 +144,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 +162,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,10 +255,18 @@ 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)>,
 L<guestfish(1)>,
+L<virt-filesystems(1)>,
 L<virt-list-filesystems(1)>,
 L<virt-resize(1)>,
 L<Sys::Guestfs(3)>,
@@ -203,11 +276,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
@@ -221,4 +294,4 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.