next if $obj eq "";
if ($obj =~ /^@(\S+)$/) {
my $indirect = load_ref($1);
- iterate_objects($callback, $arg, $1, $recursion_level + 1);
+ iterate_objects($callback, $arg, $indirect, $recursion_level + 1);
} else {
&$callback($arg, $obj);
}
my $uid = -1;
my $gid = -1;
- $uid = $info{user} + 0 if defined $info{user};
- $gid = $info{group} + 0 if defined $info{group};
+ if (defined $info{user}) {
+ my @items = split /\s/, $info{user};
+ $uid = $items[0] + 0 if exists $items[0];
+ }
+ if (defined $info{group}) {
+ my @items = split /\s/, $info{group};
+ $gid = $items[0] + 0 if exists $items[0];
+ }
chown $uid, $gid, $dest
or warn "Unable to change ownership for $dest";
# Try to parse the data as "key: value" pairs of file metadata. Also
# handle continuation lines, which start with whitespace and continue
# the previous "key: value" pair.
- if ($line =~ m/^(\w+):\s+(.*)\s*$/) {
+ if ($line =~ m/^(\w+):\s*(.*)$/) {
$info{$1} = $2;
$last_key = $1;
} elsif ($line =~/^\s/ && defined $last_key) {
$OBJECT_DIR = dirname($descriptor);
print "Source directory: $OBJECT_DIR\n" if $VERBOSE;
-# Read the snapshot descriptor to find the root object.
+# Read the snapshot descriptor to find the root object. Parse it to get a set
+# of key/value pairs.
open DESCRIPTOR, "<", $descriptor
or die "Cannot open backup descriptor file $descriptor: $!";
-my $line = <DESCRIPTOR>;
-if ($line !~ m/^Root: (\S+)$/) {
+my %descriptor = ();
+my ($line, $last_key);
+while (defined($line = <DESCRIPTOR>)) {
+ # Any lines of the form "key: value" should be inserted into the
+ # %descriptor dictionary. Any continuation line (a line starting with
+ # whitespace) will append text to the previous key's value. Ignore other
+ # lines.
+ chomp $line;
+
+ if ($line =~ m/^(\w+):\s*(.*)$/) {
+ $descriptor{$1} = $2;
+ $last_key = $1;
+ } elsif ($line =~/^\s/ && defined $last_key) {
+ $descriptor{$last_key} .= $line;
+ } else {
+ undef $last_key;
+ print STDERR "Ignoring line in backup descriptor: $line\n";
+ }
+}
+
+# A valid backup descriptor should at the very least specify the root metadata
+# object.
+if (!exists $descriptor{Root}) {
die "Expected 'Root:' specification in backup descriptor file";
}
-my $root = $1;
+my $root = $descriptor{Root};
close DESCRIPTOR;
# Set the umask to something restrictive. As we unpack files, we'll originally