--- toast 2003/08/30 06:47:16 1.186 +++ toast 2003/08/31 20:18:38 1.187 @@ -1444,44 +1444,52 @@ sub smartgeturl($$) { - my($url, $dir, $ttl) = @_; - $ttl = 5 unless defined($ttl); - error("too many links: $url") unless $ttl; + my($url, $dir) = @_; - my($basename) = basename(stripquery($url)); - $basename = "index" if $basename eq ""; - my($file) = path($dir, $basename); + my(%visited); + for(1..5) + { + my($basename) = basename(stripquery($url)); + $basename = "index" if $basename eq ""; + my($file) = path($dir, $basename); - geturl($url, $file); + geturl($url, $file); + $visited{$url} = 1; - local(*FILE); - open(FILE, "<$file") || error("open $file: $!"); - my($header); - read(FILE, $header, 128) || error("read $file: $!"); - my($redir); - if($header =~ /^\<.*\bHTML\b/i) - { - seek(FILE, 0, 0) || error("rewind $file: $!"); - my(@links) = reverse(sort cmpab linksfromstream(*FILE, $url)); - for (@links) + local(*FILE); + open(FILE, "<$file") || error("open $file: $!"); + my($header); + read(FILE, $header, 128) || error("read $file: $!"); + my($redir); + if($header =~ /^\<.*\bHTML\b/i) { - $redir = $_ if !$redir && basename(stripquery($_)) eq $basename; - } - my($ext); - for $ext (qw[.tar.bz2 .tar.gz .tgz .zip .rpm]) - { + seek(FILE, 0, 0) || error("rewind $file: $!"); + my(@links) = reverse(sort cmpab linksfromstream(*FILE, $url)); for (@links) { - $redir = $_ if !$redir && stripquery($_) =~ /\Q$ext\E$/i; + $redir = $_ if !$redir && basename(stripquery($_)) eq $basename + && !$visited{$_}; } + my($ext); + for $ext (qw[.tar.bz2 .tar.gz .tgz .zip .rpm]) + { + for (@links) + { + $redir = $_ if !$redir && stripquery($_) =~ /\Q$ext\E$/i + && !$visited{$_}; + } + } } - } - close(FILE) || error("close $file: $!"); + close(FILE) || error("close $file: $!"); - return true unless $redir; + return true unless $redir; - rm($file); - return &smartgeturl($redir, $dir, $ttl - 1); + rm($file); + $url = $redir; + error if $visited{$url}; + } + + error("too many links: $url"); } sub autorenamepkg($$)