my %vars = (
'dir-mode' => \$d_mode,
'file-mode' => \$f_mode,
'link-mode' => \$l_mode,
'dir-owner' => \$d_own,
'file-owner' => \$f_own,
'link-owner' => \$l_own,
'dir-group' => \$d_grp,
'file-group' => \$f_grp,
'link-group' => \$l_grp,
);
for my $testy (keys %{ $config{$test}{$tester} }) {
unless ($vars{$testy}) {
warn "Unexpected test key '$testy'";
next;
}
${ $vars{$testy} } = $config{$test}{$tester}{$testy};
}
####
my $wanted_this_time = {
mode => $wanted_mode,
owner => $wanted_owner,
group => $wanted_group,
};
####
my $wanted = {
if_directory => {
mode => $dir_mode,
owner => $dir_owner,
group => $dir_group,
},
if_link => { ... }
if_file => { ... }
};
####
my %wanted;
my %validfile = map +($_ => 1), qw/ dir file link /;
my %validupdate = map +($_ => 1), qw/ mode owner group /;
for (keys %{ $config{$test}{$tester} }) {
my($filetype, $updatetype} = split /-/, $_, 2;
unless ($validfile{$filetype} && $validupdate($updatetype}) {
warn "Unexpected directive '$_'";
next;
}
$wanted{$filetype}{$updatetype} = $config{$test}{$tester}{$_};
}
[...]
sub wanted_c {
stat($_);
my $wanted =
(-d _ ? $wanted{'dir'})
: (-l _ ? $wanted{'link'})
: (-f _ ? $wanted{'file'})
: return; # ?? warn unexpected type?
return unless $wanted; # nothing to change
if (defined $wanted->{'mode'}) {
change_mode($_, $wanted->{'mode'});
}
if (defined $wanted->{'owner'}) {
change_owner($_, $wanted->{'owner'});
}
if (defined $wanted->{'group'}) {
change_group($_, $wanted->{'group'});
}
}
####
my %filetypes = (
'dir' => sub { -d _ },
'link' => sub { -l _ },
'file' => sub { -f _ },
);
my %updatetypes = (
'mode' => \&change_mode,
'owner' => \&change_owner,
'group' => \&change_group,
);
sub wanted_c {
stat($_);
for my $filetype (keys %wanted) {
next unless &{ $filetypes{$filetype} };
my $wanted = $wanted{$filetype};
for my $update (keys %$wanted) {
&{ $updatetypes{$update} }($_, $wanted->{$update});
}
}
}