package IPTables::IPv4::TableTie;
use IPTables::IPv4::Chain;
sub TIEHASH {
my($self, $th_r) = @_;
return bless {'TABLE' => \$th_r}, $self;
}
sub FETCH {
my($self, $chainname) = @_;
unless(${$self->{TABLE}}->is_chain($chainname)) {
return undef;
}
my %data;
tie(%data, 'IPTables::IPv4::Chain', ${$self->{TABLE}}, $chainname);
return(\%data);
}
sub STORE {
my($self, $chainname, $value) = @_;
my %chain;
return undef unless ref($value) eq "HASH";
${$self->{TABLE}}->create_chain($chainname) unless
${$self->{TABLE}}->is_chain($chainname);
tie(%chain, 'IPTables::IPv4::Chain', ${$self->{TABLE}}, $chainname);
%chain = %$value;
}
sub DELETE {
my($self, $chainname) = @_;
${$self->{TABLE}}->flush_entries($chainname);
${$self->{TABLE}}->delete_chain($chainname)
unless ${$self->{TABLE}}->builtin($chainname);
}
sub CLEAR {
my($self) = @_;
$self->DELETE($_) foreach ${$self->{TABLE}}->list_chains();
}
sub EXISTS {
my($self, $chainname) = @_;
return ${$self->{TABLE}}->is_chain($chainname);
}
sub FIRSTKEY {
my($self) = @_;
return (${$self->{TABLE}}->list_chains())[0];
}
sub NEXTKEY {
my($self, $prevkey) = @_;
my @chains = ${$self->{TABLE}}->list_chains();
for(my $i = 0; $i <= $#chains; $i++) {
return $chains[$i+1] if $chains[$i] eq $prevkey;
}
return $chains[0];
}
sub DESTROY {
my($self) = @_;
${$self->{TABLE}}->commit();
}
1;
# vim: ts=4