Merge tag 'upstream/3.3.3'
[debian/amanda] / perl / Amanda / Changer / rait.pm
index 5a8a0c9c99aef1086c4ef43d3713961b8cd7e55e..5741c773721485a31c4cdb9d3cb3a6ba82976910 100644 (file)
@@ -1,8 +1,9 @@
-# Copyright (c) 2009,2010 Zmanda, Inc.  All Rights Reserved.
+# Copyright (c) 2009-2012 Zmanda, Inc.  All Rights Reserved.
 #
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 as published
-# by the Free Software Foundation.
+# 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
@@ -20,6 +21,7 @@ package Amanda::Changer::rait;
 
 use strict;
 use warnings;
+use Carp;
 use vars qw( @ISA );
 @ISA = qw( Amanda::Changer );
 
@@ -64,8 +66,12 @@ sub new {
        my @annotated_errs;
        for my $i (0 .. @children-1) {
            next unless $children[$i]->isa("Amanda::Changer::Error");
-           push @annotated_errs,
-               [ $kidspecs[$i], $children[$i] ];
+           if ($children[$i]->isa("Amanda::Changer::Error")) {
+               push @annotated_errs,
+                   [ $kidspecs[$i], $children[$i] ];
+           } elsif ($children[$i]->isa("Amanda::Changer")) {
+               $children[$i]->quit();
+           }
        }
        return Amanda::Changer->make_combined_error(
                "fatal", [ @annotated_errs ]);
@@ -81,6 +87,17 @@ sub new {
     return $self;
 }
 
+sub quit {
+    my $self = shift;
+
+    # quit each child
+    foreach my $child (@{$self->{'children'}}) {
+       $child->quit() if $child ne "ERROR";
+    }
+
+    $self->SUPER::quit();
+}
+
 # private method to help handle slot input
 sub _kid_slots_ok {
     my ($self, $res_cb, $slot, $kid_slots_ref, $err_ref) = @_;
@@ -510,7 +527,7 @@ sub _for_each_child {
        ($params{'oksub'}, $params{'errsub'}, $params{'parent_cb'}, $params{'args'});
 
     if (defined($args)) {
-       die "number of args did not match number of children"
+       confess "number of args did not match number of children"
            unless (@$args == $self->{'num_children'});
     } else {
        $args = [ ( undef ) x $self->{'num_children'} ];