'libnet' => {
'MAINTAINER' => 'gbarr',
- 'DISTRIBUTION' => 'GBARR/libnet-1.22.tar.gz',
+ 'DISTRIBUTION' => 'SHAY/libnet-1.22_02.tar.gz',
'FILES' => q[cpan/libnet],
'EXCLUDED' => [
qw( Configure
install-nomake
- Makefile.PL
),
],
'CUSTOMIZED' => ['Makefile.PL'],
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'blead',
},
'Locale-Codes' => {
+libnet 1.22_02 -- Thu Aug 08 2013
+
+ * Make Net::FTP::dataconn::close() more robust [Together with changes to
+ Net::FTP already made in 1.22_01, this resolves CPAN RT#37700]
+ * Document scalar/list context return values from Net::Cmd::message()
+ * Fix broken URL [Resolves CPAN RT#68749]
+ * Fix documentation typo in Net::Netrc
+ * Fix broken POD in Net::POP3
+ * Improve Net::SMTP documentation of new(), auth() and message() [Resolves
+ CPAN RT#36038]
+ * Add proper skips to skipped tests in ftp.t
+ * Import hostname.t fix from perl core commit #adeb94125a
+ * Add time.t, imported from perl core commit #c85707204c
+ * Add new maintainer information, with updated CPAN and GitHub links
+
+libnet 1.22_01 -- Mon May 31 09:40:25 CDT 2010
+
+ * Do not create/pass a remote name if one is not given to put_unique
+ * Add ->passive method to switch between PORT/PASV connections
+ * Accept - in command parsed from SMTP HELO response
+ * Allow group to set to a group named "0"
+ * Set $@ when ->new returns undef
+ * Add support for LocalAddr to be passed to ->new
+ * Document that timeout is in seconds
+ * Fix leading . encoding in datasend
+ * Make ->supported check ->feature
+ * Allow words other than FILE to prefix the unique name returned in info message from stou
+ * Send ALLO command just before the store command
+ * Avoid warnings when server do not prefix messages with codes
+ * Use uppercase characters for xtext encoding
+ * Catch timeout condition while doing an abort
+ * Ensure REST is sent directly before command being restarted
+ * [rt.cpan.org #49920] Fix URL [Leon Brocard]
+ * Avoid long hang on Mac OS X when hostname is *.local by not calling gethostbyname [Father Chrysostomos]
+ * Avoid infinite recursion in rmdir
+ * Allow finding _netrc on machines that do not support .netrc [Ben Bimber]
+
libnet 1.22 -- Sun Aug 26 07:13:18 CDT 2007
Bug Fixes
WriteMakefile (
NAME => 'Net',
DISTNAME => 'libnet',
- VERSION => '1.22', # finds $VERSION
+ VERSION => '1.22_02', # finds $VERSION
AUTHOR => 'Graham Barr <gbarr@pobox.com>',
ABSTRACT => 'Collection of Network protocol modules',
);
}
}
-$VERSION = "2.29";
+$VERSION = "2.29_2";
@ISA = qw(Exporter);
@EXPORT = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);
($code, $more) = $cmd->parse_response($str);
unless (defined $code) {
$cmd->ungetline($str);
+ $@ = $str; # $@ used as tunneling hack
last;
}
last unless ($more);
}
+ return undef unless defined $code;
substr($code, 0, 1);
}
return 0 unless defined(fileno($cmd));
my $last_ch = ${*$cmd}{'net_cmd_last_ch'};
+
+ # We have not send anything yet, so last_ch = "\012" means we are at the start of a line
$last_ch = ${*$cmd}{'net_cmd_last_ch'} = "\012" unless defined $last_ch;
return 1 unless length $line;
my $first_ch = '';
if ($last_ch eq "\015") {
- $first_ch = "\012" if $line =~ s/^\012//;
+ # Remove \012 so it does not get prefixed with another \015 below
+ # and escape the . if there is one following it because the fixup
+ # below will not find it
+ $first_ch = "\012" if $line =~ s/^\012(\.?)/$1$1/;
}
elsif ($last_ch eq "\012") {
+ # Fixup below will not find the . as the first character of the buffer
$first_ch = "." if $line =~ /^\./;
}
=item message ()
-Returns the text message returned from the last command
+Returns the text message returned from the last command. In a scalar
+context it returns a single string, in a list context it will return
+each line as a separate element
=item code ()
@EXPORT = qw(%NetConfig);
@ISA = qw(Net::LocalCfg Exporter);
-$VERSION = "1.11";
+$VERSION = "1.11_01";
eval { local $SIG{__DIE__}; require Net::LocalCfg };
you want to transfer data you have to tell the server the address and
port to connect to. Passive mode is when the server provide the
address and port and you establish the connection.
-
+
With some firewalls active mode does not work as the server cannot
connect to your machine (because you are behind a firewall) and the firewall
does not re-write the command. In this case you should set C<ftp_ext_passive>
@ISA = qw(Exporter);
@EXPORT_OK = qw(hostname hostdomain hostfqdn domainname);
-$VERSION = "2.20";
+$VERSION = "2.21";
my ($host, $domain, $fqdn) = (undef, undef, undef);
if (defined $fqdn);
_hostname();
+
+ # *.local names are special on darwin. If we call gethostbyname below, it
+ # may hang while waiting for another, non-existent computer to respond.
+ if($^O eq 'darwin' && $host =~ /\.local$/) {
+ return $host;
+ }
+
_hostdomain();
# Assumption: If the host name does not contain a period
use Net::Config;
use Fcntl qw(O_WRONLY O_RDONLY O_APPEND O_CREAT O_TRUNC);
-$VERSION = '2.77';
+$VERSION = '2.77_3';
@ISA = qw(Exporter Net::Cmd IO::Socket::INET);
# Someday I will "use constant", when I am not bothered to much about
unless ($ftp->response() == CMD_OK) {
$ftp->close();
- $@ = $ftp->message;
+ # keep @$ if no message. Happens, when response did not start with a code.
+ $@ = $ftp->message || $@;
undef $ftp;
}
${*$me}{'net_ftp_host'};
}
+sub passive {
+ my $ftp = shift;
+ return ${*$ftp}{'net_ftp_passive'} unless @_;
+ ${*$ftp}{'net_ftp_passive'} = shift;
+}
+
sub hash {
my $ftp = shift; # self
return undef
unless @filelist; # failed, it is probably not a directory
+ return $ftp->delete($dir)
+ if @filelist == 1 and $dir eq $filelist[0];
+
# Go thru and delete each file or the directory
my $file;
foreach $file (map { m,/, ? $_ : "$dir/$_" } @filelist) {
my $localfd = ref($local) || ref(\$local) eq "GLOB";
- unless (defined $remote) {
+ if (!defined($remote) and 'STOU' ne uc($cmd)) {
croak 'Must specify remote filename with stream input'
if $localfd;
# a pipe, or device) and if so get the file size from stat, and send
# an ALLO command before sending the STOR, STOU, or APPE command.
my $size = do { local $^W; -f $local && -s _ }; # no ALLO if sending data from a pipe
- $ftp->_ALLO($size) if $size;
+ ${*$ftp}{'net_ftp_allo'} = $size if $size;
}
croak("Bad remote filename '$remote'\n")
- if $remote =~ /[\r\n]/s;
+ if defined($remote) and $remote =~ /[\r\n]/s;
if ($localfd) {
$loc = $local;
delete ${*$ftp}{'net_ftp_port'};
delete ${*$ftp}{'net_ftp_pasv'};
- $sock = $ftp->_data_cmd($cmd, $remote)
+ $sock = $ftp->_data_cmd($cmd, grep { defined } $remote)
or return undef;
- $remote = ($ftp->message =~ /FILE:\s*(.*)/)[0]
+ $remote = ($ftp->message =~ /\w+\s*:\s*(.*)/)[0]
if 'STOU' eq uc $cmd;
my $blksize = ${*$ftp}{'net_ftp_blksize'};
return $hash->{$cmd}
if exists $hash->{$cmd};
+ return $hash->{$cmd} = 1
+ if $ftp->feature($cmd);
+
return $hash->{$cmd} = 0
unless $ftp->_HELP($cmd);
{
my $data = undef;
- $ok = defined $ftp->pasv;
- $ok = $ftp->_REST($where)
- if $ok && $where;
-
- if ($ok) {
- $ftp->command($cmd, @_);
- $data = $ftp->_dataconn();
- $ok = CMD_INFO == $ftp->response();
- if ($ok) {
- $data->reading
- if $data && $cmd =~ /RETR|LIST|NLST/;
- return $data;
- }
- $data->_close
- if $data;
+ return undef unless defined $ftp->pasv;
+ $data = $ftp->_dataconn() or return undef;
+
+ if ($where and !$ftp->_REST($where)) {
+ my ($status, $message) = ($ftp->status, $ftp->message);
+ $ftp->abort;
+ $ftp->set_status($status, $message);
+ return undef;
}
+
+ $ftp->command($cmd, @_);
+ if (CMD_INFO == $ftp->response()) {
+ $data->reading
+ if $cmd =~ /RETR|LIST|NLST/;
+ return $data;
+ }
+ $data->_close;
+
return undef;
}
return undef
unless $ok;
+ if ($cmd =~ /(STOR|APPE|STOU)/ and exists ${*$ftp}{net_ftp_allo}) {
+ $ftp->_ALLO(delete ${*$ftp}{net_ftp_allo})
+ or return undef;
+ }
+
$ftp->command($cmd, @_);
return 1
sub response {
my $ftp = shift;
- my $code = $ftp->SUPER::response();
+ my $code = $ftp->SUPER::response() || 5; # assume 500 if undef
delete ${*$ftp}{'net_ftp_pasv'}
if ($code != CMD_MORE && $code != CMD_INFO);
my $ftp = shift;
# Darn MS FTP server is a load of CRAP !!!!
+ # Expect to see undef here.
return ()
- unless ${*$ftp}{'net_cmd_code'} + 0;
+ unless 0 + (${*$ftp}{'net_cmd_code'} || 0);
(${*$ftp}{'net_cmd_code'}, 1);
}
B<Port> - The port number to connect to on the remote machine for the
FTP connection
-B<Timeout> - Set a timeout value (defaults to 120)
+B<Timeout> - Set a timeout value in seconds (defaults to 120)
B<Debug> - debug level (see the debug method in L<Net::Cmd>)
Change directory to the parent of the current directory.
+=item passive ( [ PASSIVE ] )
+
+Set or get if data connections will be initiated in passive mode.
+
=item pwd ()
Returns the full pathname of the current directory.
L<Net::Cmd>
ftp(1), ftpd(8), RFC 959
-http://www.cis.ohio-state.edu/htbin/rfc/rfc959.html
+http://www.ietf.org/rfc/rfc959.txt
=head1 USE EXAMPLES
use Net::Cmd;
use Errno;
-$VERSION = '0.11';
+$VERSION = '0.11_02';
@ISA = qw(IO::Socket::INET);
$data->SUPER::close();
delete ${*$ftp}{'net_ftp_dataconn'}
- if exists ${*$ftp}{'net_ftp_dataconn'}
+ if defined $ftp
+ && exists ${*$ftp}{'net_ftp_dataconn'}
&& $data == ${*$ftp}{'net_ftp_dataconn'};
}
if (exists ${*$data}{'net_ftp_bytesread'} && !${*$data}{'net_ftp_eof'}) {
my $junk;
- $data->read($junk, 1, 0);
+ eval { local($SIG{__DIE__}); $data->read($junk, 1, 0) };
return $data->abort unless ${*$data}{'net_ftp_eof'};
}
$data->_close;
+ return unless defined $ftp;
+
$ftp->response() == CMD_OK
&& $ftp->message =~ /unique file name:\s*(\S*)\s*\)/
&& (${*$ftp}{'net_ftp_unique'} = $1);
use Time::Local;
use Net::Config;
-$VERSION = "2.24";
+$VERSION = "2.24_1";
@ISA = qw(Net::Cmd IO::Socket::INET);
@{$hosts} = qw(news)
unless @{$hosts};
+ my %connect = ( Proto => 'tcp');
+ my $o;
+ foreach $o (qw(LocalAddr Timeout)) {
+ $connect{$o} = $arg{$o} if exists $arg{$o};
+ }
+ $connect{Timeout} = 120 unless defined $connect{Timeout};
+ $connect{PeerPort} = $arg{Port} || 'nntp(119)';
my $h;
foreach $h (@{$hosts}) {
- $obj = $type->SUPER::new(
- PeerAddr => ($host = $h),
- PeerPort => $arg{Port} || 'nntp(119)',
- Proto => 'tcp',
- Timeout => defined $arg{Timeout}
- ? $arg{Timeout}
- : 120
- )
+ $connect{PeerAddr} = $h;
+ $obj = $type->SUPER::new(%connect)
and last;
}
return undef
unless defined $obj;
- ${*$obj}{'net_nntp_host'} = $host;
+ ${*$obj}{'net_nntp_host'} = $connect{PeerAddr};
$obj->autoflush(1);
$obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
sub group {
@_ == 1 || @_ == 2 or croak 'usage: $nntp->group( [ GROUP ] )';
my $nntp = shift;
- my $grp = ${*$nntp}{'net_nntp_group'} || undef;
+ my $grp = ${*$nntp}{'net_nntp_group'};
return $grp
unless (@_ || wantarray);
my $newgrp = shift;
- return wantarray ? () : undef
- unless $nntp->_GROUP($newgrp || $grp || "")
- && $nntp->message =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\S+)/;
+ $newgrp = (defined($grp) and length($grp)) ? $grp : ""
+ unless defined($newgrp) and length($newgrp);
+
+ return
+ unless $nntp->_GROUP($newgrp) and $nntp->message =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\S+)/;
my ($count, $first, $last, $group) = ($1, $2, $3, $4);
with a value of zero, then this command will not be sent and the
connection will be left talking to nnrpd.
+B<LocalAddr> - If multiple IP addresses are present on the client host
+with a valid route to the destination, you can specify the address your
+C<Net::NNTP> connects from and this way override the operating system's
+pick.
+
=back
=head1 METHODS
use Carp;
use strict;
use FileHandle;
-use vars qw($VERSION);
+use vars qw($VERSION $TESTING);
-$VERSION = "2.12";
+$VERSION = "2.13_01";
my %netrc = ();
# Some OS's don't have `getpwuid', so we default to $ENV{HOME}
$home = eval { (getpwuid($>))[7] } || $ENV{HOME};
$home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE};
- $file = $home . "/.netrc";
+ if (-e $home . "/.netrc") {
+ $file = $home . "/.netrc";
+ }
+ elsif (-e $home . "/_netrc") {
+ $file = $home . "/_netrc";
+ }
+ else {
+ return unless $TESTING;
+ }
}
my ($login, $pass, $acct) = (undef, undef, undef);
=item lpa ()
-Return a list of login, password and account information fir the netrc entry
+Return a list of login, password and account information for the netrc entry
=back
use Carp;
use Net::Config;
-$VERSION = "2.29";
+$VERSION = "2.29_01";
@ISA = qw(Net::Cmd IO::Socket::INET);
}
-sub _STAT { shift->command('STAT')->response() == CMD_OK }
-sub _LIST { shift->command('LIST', @_)->response() == CMD_OK }
+sub _STAT { shift->command('STAT' )->response() == CMD_OK }
+sub _LIST { shift->command('LIST', @_)->response() == CMD_OK }
sub _RETR { shift->command('RETR', $_[0])->response() == CMD_OK }
sub _DELE { shift->command('DELE', $_[0])->response() == CMD_OK }
-sub _NOOP { shift->command('NOOP')->response() == CMD_OK }
-sub _RSET { shift->command('RSET')->response() == CMD_OK }
-sub _QUIT { shift->command('QUIT')->response() == CMD_OK }
-sub _TOP { shift->command('TOP', @_)->response() == CMD_OK }
-sub _UIDL { shift->command('UIDL', @_)->response() == CMD_OK }
+sub _NOOP { shift->command('NOOP' )->response() == CMD_OK }
+sub _RSET { shift->command('RSET' )->response() == CMD_OK }
+sub _QUIT { shift->command('QUIT' )->response() == CMD_OK }
+sub _TOP { shift->command( 'TOP', @_)->response() == CMD_OK }
+sub _UIDL { shift->command('UIDL', @_)->response() == CMD_OK }
sub _USER { shift->command('USER', $_[0])->response() == CMD_OK }
sub _PASS { shift->command('PASS', $_[0])->response() == CMD_OK }
-sub _APOP { shift->command('APOP', @_)->response() == CMD_OK }
+sub _APOP { shift->command('APOP', @_)->response() == CMD_OK }
sub _PING { shift->command('PING', $_[0])->response() == CMD_OK }
-
-
sub _RPOP { shift->command('RPOP', $_[0])->response() == CMD_OK }
-sub _LAST { shift->command('LAST')->response() == CMD_OK }
-
-
-sub _CAPA { shift->command('CAPA')->response() == CMD_OK }
+sub _LAST { shift->command('LAST' )->response() == CMD_OK }
+sub _CAPA { shift->command('CAPA' )->response() == CMD_OK }
sub quit {
=over 4
-=item new ( [ HOST ] [, OPTIONS ] 0
+=item new ( [ HOST ] [, OPTIONS ] )
This is the constructor for a new Net::POP3 object. C<HOST> is the
name of the remote host to which an POP3 connection is required.
use Net::Cmd;
use Net::Config;
-$VERSION = "2.31";
+$VERSION = "2.31_2";
@ISA = qw(Net::Cmd IO::Socket::INET);
$obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
unless ($obj->response() == CMD_OK) {
+ my $err = ref($obj) . ": " . $obj->code . " " . $obj->message;
$obj->close();
+ $@ = $err;
return undef;
}
(${*$obj}{'net_smtp_domain'}) = $obj->message =~ /\A\s*(\S+)/;
unless ($obj->hello($arg{Hello} || "")) {
+ my $err = ref($obj) . ": " . $obj->code . " " . $obj->message;
$obj->close();
+ $@ = $err;
return undef;
}
my $ln;
foreach $ln (@msg) {
$h->{uc $1} = $2
- if $ln =~ /(\w+)\b[= \t]*([^\n]*)/;
+ if $ln =~ /([-\w]+)\b[= \t]*([^\n]*)/;
}
}
elsif ($me->status == CMD_ERROR) {
if (defined($v = delete $opt{Envelope})) {
if (exists $esmtp->{DSN}) {
- $v =~ s/([^\041-\176]|=|\+)/sprintf "+%02x", ord($1)/sge;
+ $v =~ s/([^\041-\176]|=|\+)/sprintf "+%02X", ord($1)/sge;
$opts .= " ENVID=$v";
}
else {
use Net::SMTP;
- $smtp = Net::SMTP->new('mailhost');
+ my $smtp = Net::SMTP->new('mailhost');
$smtp->mail($ENV{USER});
- $smtp->to('postmaster');
-
- $smtp->data();
- $smtp->datasend("To: postmaster\n");
- $smtp->datasend("\n");
- $smtp->datasend("A simple test message\n");
- $smtp->dataend();
+ if ($smtp->to('postmaster')) {
+ $smtp->data();
+ $smtp->datasend("To: postmaster\n");
+ $smtp->datasend("\n");
+ $smtp->datasend("A simple test message\n");
+ $smtp->dataend();
+ } else {
+ print "Error: ", $smtp->message();
+ }
$smtp->quit;
This is the constructor for a new Net::SMTP object. C<HOST> is the
name of the remote host to which an SMTP connection is required.
+On failure C<undef> will be returned and C<$@> will contain the reason
+for the failure.
+
C<HOST> is optional. If C<HOST> is not given then it may instead be
passed as the C<Host> option described below. If neither is given then
the C<SMTP_Hosts> specified in C<Net::Config> will be used.
specifies a string to pass as your mail domain. If not given localhost.localdomain
will be used.
-B<Host> - SMTP host to connect to. It may be a single scalar, as defined for
-the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+B<Host> - SMTP host to connect to. It may be a single scalar (hostname[:port]),
+as defined for the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
an array with hosts to try in turn. The L</host> method will return the value
which was used to connect to the host.
+B<Port> - port to connect to. Format - C<PeerHost> from L<IO::Socket::INET> new method.
+Default - 25.
+
B<LocalAddr> and B<LocalPort> - These parameters are passed directly
to IO::Socket to allow binding the socket to a local port.
=item auth ( USERNAME, PASSWORD )
-Attempt SASL authentication.
+Attempt SASL authentication. Requires Authen::SASL module.
=item mail ( ADDRESS [, OPTIONS] )
$smtp->recipient(@recipients, { Notify => ['NEVER'], SkipBad => 1 }); # Good
You may use any combination of these three values 'SUCCESS','FAILURE','DELAY' in
-the anonymous array reference as defined by RFC3461 (see http://rfc.net/rfc3461.html
+the anonymous array reference as defined by RFC3461 (see http://www.ietf.org/rfc/rfc3461.txt
for more information. Note: quotations in this topic from same.).
A Notify parameter of 'SUCCESS' or 'FAILURE' "requests that a DSN be issued on
Most sites usually disable this feature in their SMTP service configuration.
Use "Debug => 1" option under new() to see if disabled.
+=item message ()
+
+Returns the text message returned from the last command. (Net::Cmd method)
+
=item help ( [ $subject ] )
Request help text from the server. Returns the text or undef upon failure
This document is distributed with the libnet distribution, and is also
available on the libnet web page at
- http://search.cpan.org/~gbarr/libnet/
+ http://search.cpan.org/dist/libnet/
=head2 How to contribute to this document
-You may mail corrections, additions, and suggestions to me
-gbarr@pobox.com.
+You may report corrections, additions, and suggestions on the
+CPAN request tracker at
+
+ http://rt.cpan.org/Dist/Display.html?Name=libnet
=head1 Author and Copyright Information
This document is free; you can redistribute it and/or modify it
under the terms of the Artistic License.
+Currently maintained by Steve Hay <shay@cpan.org>.
+
=head2 Disclaimer
This information is offered in good faith and in the hope that it may
The latest libnet release is always on CPAN, you will find it
in
- http://www.cpan.org/modules/by-module/Net/
-
-The latest release and information is also available on the libnet web page
-at
-
- http://search.cpan.org/~gbarr/libnet/
+ http://search.cpan.org/dist/libnet/
=head1 Using Net::FTP
The latest version of libnet is available from the Comprehensive Perl
Archive Network (CPAN). To find a CPAN site near you see:
- http://search.cpan.org/~gbarr/libnet/
+ http://search.cpan.org/dist/libnet/
-The subversion source repository can be browsed at
+The GitHub source repository can be browsed at
- http://svn.goingon.net/viewvc/libnet/
+ http://github.com/steve-m-hay/perl-libnet
-If you have a subversion client, then you can checkout the latest code with
+If you have a Git client, then you can checkout the latest code with
- svn co http://svn.goingon.net/repos/libnet/trunk libnet
+ git clone http://github.com/steve-m-hay/perl-libnet.git
INSTALLATION
Questions about how to use this library should be directed to the
comp.lang.perl.modules USENET Newsgroup. Bug reports and suggestions
-for improvements can be sent to me at <gbarr@pobox.com>.
+for improvements can be reported on the CPAN request tracker at
+
+ http://rt.cpan.org/Dist/Display.html?Name=libnet
Most of the modules in this library have an option to output a debug
transcript to STDERR. When reporting bugs/problems please, if possible,
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
+Currently maintained by Steve Hay <shay@cpan.org>.
+
Share and Enjoy!
@INC = '../lib';
}
if (!eval "require Socket") {
- print "1..0 # no Socket\n"; exit 0;
+ print "1..0 # Skip: no Socket module\n"; exit 0;
}
if (ord('A') == 193 && !eval "require Convert::EBCDIC") {
- print "1..0 # EBCDIC but no Convert::EBCDIC\n"; exit 0;
+ print "1..0 # Skip: EBCDIC but no Convert::EBCDIC\n"; exit 0;
}
}
use Net::Config;
use Net::FTP;
-unless(defined($NetConfig{ftp_testhost}) && $NetConfig{test_hosts}) {
- print "1..0\n";
+unless(defined($NetConfig{ftp_testhost})) {
+ print "1..0 # Skip: no ftp_testhost defined in config\n";
+ exit 0;
+}
+
+unless($NetConfig{test_hosts}) {
+ print "1..0 # Skip: test_hosts not enabled in config\n";
exit 0;
}
eval { require Net::Netrc; };
ok( !$@, 'should be able to require() Net::Netrc safely' );
ok( exists $INC{'Net/Netrc.pm'}, 'should be able to use Net::Netrc' );
+$Net::Netrc::TESTING=$Net::Netrc::TESTING=1;
SKIP: {
skip('incompatible stat() handling for OS', 4), next SKIP
=item *
+The libnet module collection has been upgraded from version 1.22 to 1.22_02.
+
+=item *
+
L<List::Util> has been upgraded from version 1.27 to 1.30
L<List::Util> now includes C<pairgrep>, C<pairmap>, C<pairs>, C<pairkeys>,
Text::Balanced cpan/Text-Balanced/t/08_extvar.t 0776ef2cbdad5b1fbefb300541d079212cc24d92
Text::Balanced cpan/Text-Balanced/t/09_gentag.t 42361b5dfb3bb728bce20f4fb0d92ccfb27c2ba7
Time::HiRes cpan/Time-HiRes/Makefile.PL 178c13f9fef25520cc752581b86e5e4c05a5eade
-libnet cpan/libnet/Makefile.PL 5554b71464b45f5cc002e55f2464f7ff4abd05b6
+libnet cpan/libnet/Makefile.PL 1c5fb6a4a241902ecf3b10ec39d0a5606e796ffd
podlators cpan/podlators/scripts/pod2man.PL f81acf53f3ff46cdcc5ebdd661c5d13eb35d20d6
podlators cpan/podlators/scripts/pod2text.PL b4693fcfe4a0a1b38a215cfb8985a65d5d025d69