1 #line 1 "inc/Module/Install/Fetch.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/Fetch.pm"
2 package Module::Install::Fetch;
3 use Module::Install::Base; @ISA = qw(Module::Install::Base);
8 my ($self, %args) = @_;
9 my ($scheme, $host, $path, $file) =
10 $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
12 if ($scheme eq 'http' and !eval { require LWP::Simple; 1 }) {
13 $args{url} = $args{ftp_url}
14 or (warn("LWP support unavailable!\n"), return);
15 ($scheme, $host, $path, $file) =
16 $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
20 print "Fetching '$file' from $host... ";
22 unless (eval { require Socket; Socket::inet_aton($host) }) {
23 warn "'$host' resolve failed!\n";
27 return unless $scheme eq 'ftp' or $scheme eq 'http';
30 my $dir = Cwd::getcwd();
31 chdir $args{local_dir} or return if exists $args{local_dir};
33 if (eval { require LWP::Simple; 1 }) {
34 LWP::Simple::mirror($args{url}, $file);
36 elsif (eval { require Net::FTP; 1 }) { eval {
37 # use Net::FTP to get past firewall
38 my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600);
39 $ftp->login("anonymous", 'anonymous@example.com');
42 $ftp->get($file) or (warn("$!\n"), return);
45 elsif (my $ftp = $self->can_run('ftp')) { eval {
46 # no Net::FTP, fallback to ftp.exe
48 my $fh = FileHandle->new;
50 local $SIG{CHLD} = 'IGNORE';
51 unless ($fh->open("|$ftp -n")) {
52 warn "Couldn't open ftp: $!\n";
56 my @dialog = split(/\n/, << ".");
58 user anonymous anonymous\@example.com
64 foreach (@dialog) { $fh->print("$_\n") }
68 warn "No working 'ftp' program available!\n";
73 warn "Fetching failed: $@\n";
77 return if exists $args{size} and -s $file != $args{size};
78 system($args{run}) if exists $args{run};
79 unlink($file) if $args{remove};
81 print(((!exists $args{check_for} or -e $args{check_for})
82 ? "done!" : "failed! ($!)"), "\n");
83 chdir $dir; return !$?;