+sub all_files {
+ my $verbose = shift;
+ my @results;
+
+ my $each_file_fn = sub {
+ my ($filename, $header) = @_;
+ push @results, { filename => $filename, header => $header };
+ };
+ _walk($each_file_fn, $verbose);
+
+ return @results;
+}
+
+sub merge_all_files {
+ my @files = @_;
+ my %hfiles;
+ my @result;
+
+ for my $file (@files) {
+ $hfiles{$file->{'filename'}} = $file->{'header'};
+ }
+
+ foreach my $filename (keys %hfiles) {
+ next if !exists $hfiles{$filename};
+ if ($hfiles{$filename}->{'type'} == $Amanda::Header::F_DUMPFILE) {
+ push @result, {filename => $filename, header => $hfiles{$filename}};
+ my $is_tmp = ($filename =~ /\.tmp$/);
+ my $cont_filename = $filename;
+ my $cfilename = $hfiles{$cont_filename}->{'cont_filename'};
+ my $cf = $cfilename;
+ $cf .= ".tmp" if $is_tmp;
+ while (defined $cfilename && $cfilename ne "" && -f $cf) {
+ delete $hfiles{$cont_filename};
+ $cont_filename = $cf;
+ $cfilename = $hfiles{$cont_filename}->{'cont_filename'};
+ $cf = $cfilename;
+ $cf .= ".tmp" if $is_tmp;
+ }
+ delete $hfiles{$cont_filename};
+ } elsif ($hfiles{$filename}->{'type'} != $Amanda::Header::F_CONT_DUMPFILE) {
+ push @result, {filename => $filename, header => $hfiles{$filename}};
+ delete $hfiles{$filename}
+ } else {
+ # do nothing for F_CONTFILE
+ }
+ }
+
+ foreach my $filename (keys %hfiles) {
+ next if !exists $hfiles{$filename};
+ if ($hfiles{$filename}->{'type'} == $Amanda::Header::F_CONT_DUMPFILE) {
+ push @result, {filename => $filename, header => $hfiles{$filename}};
+ } else {
+ delete $hfiles{$filename}
+ }
+ }
+ return @result;
+}
+