#
# PC28 field 11 is the RR required flag
# PC28 field 12 is a VIA routing (ie it is a node call)
+#
package DXMsg;
use strict;
use vars qw(%work @msg $msgdir %valid %busy $maxage $last_clean
- @badmsg $badmsgfn);
+ @badmsg $badmsgfn $forwardfn @forward);
%work = (); # outstanding jobs
@msg = (); # messages we have
$msgdir = "$main::root/msg"; # directory contain the msgs
$maxage = 30 * 86400; # the maximum age that a message shall live for if not marked
$last_clean = 0; # last time we did a clean
+@forward = (); # msg forward table
-$badmsgfn = "$main::data/badmsg.pl"; # list of TO address we wont store
+$badmsgfn = "$msgdir/badmsg.pl"; # list of TO address we wont store
+$forwardfn = "$msgdir/forward.pl"; # the forwarding table
%valid = (
fromnode => '9,From Node',
sub process
{
my ($self, $line) = @_;
- my @f = split /[\^\~]/, $line;
+ my @f = split /\^/, $line;
my ($pcno) = $f[0] =~ /^PC(\d\d)/; # just get the number
SWITCH: {
my $noderef;
foreach $noderef (@nodelist) {
next if $noderef->call eq $main::mycall;
- next if $noderef->isolate; # maybe add code for stuff originated here?
next if grep { $_ eq $noderef->call } @{$ref->{gotit}};
+ next unless $ref->forward_it($noderef->call); # check the forwarding file
+ # next if $noderef->isolate; # maybe add code for stuff originated here?
+ # next if DXUser->get( ${$ref->{gotit}}[0] )->isolate; # is the origin isolated?
# if we are here we have a node that doesn't have this message
$ref->start_msg($noderef) if !get_busy($noderef->call) && $noderef->state eq 'normal';
my @dir;
my $ref;
- do "$badmsgfn" if -e "$badmsgfn";
- print "$@\n" if $@;
+ # load various control files
+ my @in = load_badmsg();
+ print "@in\n" if @in;
+ @in = load_forward();
+ print "@in\n" if @in;
# read in the directory
opendir($dir, $msgdir) or confess "can't open $msgdir $!";
@msg = ();
for (sort @dir) {
- next unless /^m\d+/o;
+ next unless /^m\d+$/o;
$ref = read_msg_header("$msgdir/$_");
next unless $ref;
$ref->to, $ref->from, cldate($ref->t), ztime($ref->t), $ref->subject;
}
+# load the forward table
+sub load_forward
+{
+ my @out;
+ do "$forwardfn" if -e "$forwardfn";
+ push @out, $@ if $@;
+ return @out;
+}
+
+# load the bad message table
+sub load_badmsg
+{
+ my @out;
+ do "$badmsgfn" if -e "$badmsgfn";
+ push @out, $@ if $@;
+ return @out;
+}
+
+#
+# forward that message or not according to the forwarding table
+# returns 1 for forward, 0 - to ignore
+#
+
+sub forward_it
+{
+ my $ref = shift;
+ my $call = shift;
+ my $i;
+
+ for ($i = 0; $i < @forward; $i += 5) {
+ my ($sort, $field, $pattern, $action, $bbs) = @forward[$i..($i+4)];
+ my $tested;
+
+ # are we interested?
+ last if $ref->{private} && $sort ne 'P';
+ last if !$ref->{private} && $sort ne 'B';
+
+ # select field
+ $tested = $ref->{to} if $field eq 'T';
+ $tested = $ref->{from} if $field eq 'F';
+ $tested = $ref->{origin} if $field eq 'O';
+ $tested = $ref->{subject} if $field eq 'S';
+
+ if (!$pattern || $tested =~ m{$pattern}i) {
+ return 0 if $action eq 'I';
+ return 1 if !$bbs || grep $_ eq $call, @{$bbs};
+ }
+ }
+ return 0;
+}
+
no strict;
sub AUTOLOAD
{