From: Dirk Koopman Date: Sat, 23 Jun 2007 20:39:37 +0000 (+0100) Subject: temporary commit for findroutes X-Git-Tag: 1.55~146 X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?p=spider.git;a=commitdiff_plain;h=916f0deef0e085647471d5959a55c2ddb815a044 temporary commit for findroutes --- diff --git a/cmd/show/route.pl b/cmd/show/route.pl index d4120e0c..6d1c194c 100644 --- a/cmd/show/route.pl +++ b/cmd/show/route.pl @@ -19,7 +19,7 @@ foreach $l (@list) { my $ref = Route::get($l); if ($ref) { my $parents = $ref->isa('Route::Node') ? $l : join(',', $ref->parents); - push @out, $self->msg('route', $l, $parents, join(',', map {$_->call} $ref->alldxchan)); + push @out, $self->msg('route', $l, $parents, join(',', map {$_->call} Route::findroutes($l))); } else { push @out, $self->msg('e7', $l); } diff --git a/perl/Route.pm b/perl/Route.pm index afce3a04..1106892a 100644 --- a/perl/Route.pm +++ b/perl/Route.pm @@ -285,6 +285,34 @@ sub get return Route::Node::get($call) || Route::User::get($call); } +sub findroutes +{ + my $call = shift; + my $level = shift || 0; + my $seen = shift || {}; + my @out; + + dbg("findroutes: $call level: $level calls: " . join(',', @_)) if isdbg('routec'); + + # recursion detector + return () if $seen->{$call}; + if (my $dxchan = DXChannel::get($call)) { + $seen->{$call}++; + push @out, [$level, $dxchan]; + return @out; + } + + # deal with more nodes + my $nref = Route::Node::get($call); + foreach my $ncall (@{$nref->{nodes}}) { + dbg("recursing from $call -> $ncall") if isdbg('routec'); + my @rout = findroute($ncall, $level+1, $seen); + push @out, @rout; + } + + return $level == 0 ? map {$_->[1]} sort {$a->[0] <=> $b->[0]} @out : @out; +} + # find all the possible dxchannels which this object might be on sub alldxchan {