ls: Rewrite virt-ls in C.
[libguestfs.git] / tools / virt-ls
diff --git a/tools/virt-ls b/tools/virt-ls
deleted file mode 100755 (executable)
index 03733f7..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/perl -w
-# virt-ls
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# 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.
-
-use warnings;
-use strict;
-
-use Sys::Guestfs;
-use Sys::Guestfs::Lib qw(open_guest);
-use Pod::Usage;
-use Getopt::Long;
-use File::Temp qw/tempdir/;
-use File::Basename;
-use Locale::TextDomain 'libguestfs';
-
-=encoding utf8
-
-=head1 NAME
-
-virt-ls - List files in a virtual machine
-
-=head1 SYNOPSIS
-
- virt-ls [--options] domname directory
-
- virt-ls [--options] disk.img [disk.img ...] directory
-
-=head1 DESCRIPTION
-
-C<virt-ls> is a command line tool to list the names of files in a
-directory inside a virtual machine or disk image.
-
-C<virt-ls> is just a simple wrapper around L<libguestfs(3)>
-functionality.  For more complex cases you should look at the
-L<guestfish(1)> tool.
-
-C<virt-ls> can be used in one of three modes: simple, long and
-recursive.  A simple listing is like the ordinary L<ls(1)> command:
-
- $ virt-ls myguest /
- bin
- boot
- [etc.]
-
-With the C<-l> (C<--long>) option, C<virt-ls> shows more detail:
-
- $ virt-ls -l myguest /
- total 204
- dr-xr-xr-x.   2 root root   4096 2009-08-25 19:06 bin
- dr-xr-xr-x.   5 root root   3072 2009-08-25 19:06 boot
- [etc.]
-
-With the C<-R> (C<--recursive>) option, C<virt-ls> lists the
-names of files and directories recursively:
-
- $ virt-ls -R myguest /tmp
- foo
- foo/bar
- [etc.]
-
-You I<cannot> combine these options.  To do more complicated things,
-use L<guestfish(1)>.
-
-=head1 OPTIONS
-
-=over 4
-
-=cut
-
-my $help;
-
-=item B<--help>
-
-Display brief help.
-
-=cut
-
-my $version;
-
-=item B<--version>
-
-Display version number and exit.
-
-=cut
-
-my $uri;
-
-=item B<--connect URI> | B<-c URI>
-
-If using libvirt, connect to the given I<URI>.  If omitted, then we
-connect to the default libvirt hypervisor.
-
-If you specify guest block devices directly, then libvirt is not used
-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 $mode;
-
-=item B<-l> | B<--long>
-
-=item B<-R> | B<--recursive>
-
-Select the mode.  With neither of these options, C<virt-ls>
-produces a simple, flat list of the files in the named directory.
-
-C<virt-ls -l> produces a "long listing", which shows more detail (just
-like the plain C<ls -l> command).
-
-C<virt-ls -R> produces a recursive list of files starting at the named
-directory.  See the documentation for L<guestfs(3)/guestfs_find>
-for precise details.
-
-You cannot combine these options.
-
-=back
-
-=cut
-
-sub set_mode_l
-{
-    die __"virt-ls: cannot combine -l and -R options\n" if $mode;
-    $mode = "l";
-}
-
-sub set_mode_R
-{
-    die __"virt-ls: cannot combine -l and -R options\n" if $mode;
-    $mode = "R";
-}
-
-GetOptions ("help|?" => \$help,
-            "version" => \$version,
-            "connect|c=s" => \$uri,
-            "format=s" => \$format,
-            "long|l" => \&set_mode_l,
-            "recursive|R" => \&set_mode_R,
-    ) or pod2usage (2);
-pod2usage (1) if $help;
-if ($version) {
-    my $g = Sys::Guestfs->new ();
-    my %h = $g->version ();
-    print "$h{major}.$h{minor}.$h{release}$h{extra}\n";
-    exit
-}
-
-pod2usage (__"virt-ls: no image, VM names or directory to list given")
-    if @ARGV <= 1;
-
-my $directory = pop @ARGV;
-
-my $g;
-if ($uri) {
-    $g = open_guest (\@ARGV, address => $uri, format => $format);
-} else {
-    $g = open_guest (\@ARGV, format => $format);
-}
-
-$g->launch ();
-
-my @roots = $g->inspect_os ();
-if (@roots == 0) {
-    die __x("{prog}: No operating system could be detected inside this disk image.\n\nThis may be because the file is not a disk image, or is not a virtual machine\nimage, or because the OS type is not understood by libguestfs.\n\nIf you feel this is an error, please file a bug report including as much\ninformation about the disk image as possible.\n",
-            prog => basename ($0));
-}
-if (@roots > 1) {
-    die __x("{prog}: multiboot operating systems are not supported.\n",
-            prog => basename ($0))
-}
-my %fses = $g->inspect_get_mountpoints ($roots[0]);
-my @fses = sort { length $a <=> length $b } keys %fses;
-foreach (@fses) {
-    $g->mount_ro ($fses{$_}, $_);
-}
-
-unless ($mode) {
-    my @r = $g->ls ($directory);
-    print "$_\n" foreach @r;
-} elsif ($mode eq "l") {
-    print ($g->ll ($directory));
-} else { # $mode eq "R"
-    my $dir = tempdir (CLEANUP => 1);
-    $g->find0 ($directory, "$dir/find0");
-    open F, "$dir/find0" or die "$dir/find0: $!\n";
-    my $r;
-    my $line;
-    while (($r = read (F, $line, 1024)) > 0) {
-        $line =~ tr{\0}{\n};
-        print $line;
-    }
-    close F;
-}
-
-=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-cat(1)>,
-L<virt-tar(1)>,
-L<Sys::Guestfs(3)>,
-L<Sys::Guestfs::Lib(3)>,
-L<Sys::Virt(3)>,
-L<http://libguestfs.org/>.
-
-=head1 AUTHOR
-
-Richard W.M. Jones L<http://people.redhat.com/~rjones/>
-
-=head1 COPYRIGHT
-
-Copyright (C) 2009 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
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-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.