On 19/10/09 12:24, Richard W.M. Jones wrote:
+sub set_mode_x
+{
+ die __"virt-tar: extract/upload mode specified twice on the command line"
+ if $mode;
+ $mode = "x";
+}
+
+sub set_mode_u
+{
+ die __"virt-tar: extract/upload mode specified twice on the command line"
+ if $mode;
+ $mode = "u";
+}
I know we've done this in plenty of other places, but die() really isn't
a very nice user interface. I would change both of these to:
if($mode) {
print STDERR __"msg";
exit(1);
}
Even better, create an error reporting function which also prepends
'virt-tar: ' so this string doesn't show up repeatedly for translation.
+Getopt::Long::Configure ("bundling");
+GetOptions ("help|?" => \$help,
+ "version" => \$version,
+ "connect|c=s" => \$uri,
+ "extract|download|x" => \&set_mode_x,
+ "upload|u" => \&set_mode_u,
+ "gzip|z" => \$gzip,
+ ) or pod2usage (2);
Mixed tabs and spaces.
+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-tar: no image, VM names, directory or filename given")
+ if @ARGV<= 2;
+
+# 'pop' reads arguments right to left.
+my $tarball = pop @ARGV;
+my $directory = pop @ARGV;
+
+die __"virt-tar: either -x or -u must be specified on the command line"
+ unless $mode;
+
+my @args = (\@ARGV);
+push @args, address => $uri if $uri;
+push @args, rw => 1 if $mode eq "u";
+
+my $g = open_guest (@args);
+$g->launch ();
+
+# List of possible filesystems.
+my @partitions = get_partitions ($g);
+
+# Now query each one to build up a picture of what's in it.
+my %fses =
+ inspect_all_partitions ($g, \@partitions,
+ use_windows_registry => 0);
+
+my $oses = inspect_operating_systems ($g, \%fses);
+
+my @roots = keys %$oses;
+die __"no root device found in this operating system image" if @roots == 0;
+die __"multiboot operating systems are not supported by virt-edit" if
@roots> 1;
It's virt-tar, not virt-edit ;)
+my $root_dev = $roots[0];
+
+my $os = $oses->{$root_dev};
+mount_operating_system ($g, $os, $mode eq "u" ? 0 : 1);
The cut/paste above suggests we could do with a library function for this.
Matt
--
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team
M: +44 (0)7977 267231
GPG ID: D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490