require 5;
+use 5.006; # we use some open(X, "<", $y) syntax
package Pod::Perldoc;
use strict;
use warnings;
use vars qw($VERSION @Pagers $Bindir $Pod2man
$Temp_Files_Created $Temp_File_Lifetime
);
-$VERSION = '3.07';
+$VERSION = '3.10';
#..........................................................................
BEGIN { # Make a DEBUG constant very first thing...
use Pod::Perldoc::GetOptsOO; # uses the DEBUG.
#..........................................................................
-{ my $pager = $Config{'pager'};
- push @Pagers, $pager if -x (split /\\s+/, $pager)[0];
-}
-$Bindir = $Config{'scriptdirexp'};
-$Pod2man = "pod2man" . ( $Config{'versiononly'} ? $Config{'version'} : '' );
-
-#..........................................................................
sub TRUE () {1}
sub FALSE () {return}
*IS_MSWin32 = $^O eq 'MSWin32' ? \&TRUE : \&FALSE unless defined &IS_MSWin32;
*IS_Dos = $^O eq 'dos' ? \&TRUE : \&FALSE unless defined &IS_Dos;
*IS_OS2 = $^O eq 'os2' ? \&TRUE : \&FALSE unless defined &IS_OS2;
+ *IS_Cygwin = $^O eq 'cygwin' ? \&TRUE : \&FALSE unless defined &IS_Cygwin;
}
$Temp_File_Lifetime ||= 60 * 60 * 24 * 5;
# that anyone's still looking at it!!
# (Currently used only by the MSWin cleanup routine)
+
+#..........................................................................
+{ my $pager = $Config{'pager'};
+ push @Pagers, $pager if -x (split /\s+/, $pager)[0] or IS_VMS;
+}
+$Bindir = $Config{'scriptdirexp'};
+$Pod2man = "pod2man" . ( $Config{'versiononly'} ? $Config{'version'} : '' );
+
# End of class-init stuff
#
###########################################################################
#
# Option accessors...
-foreach my $subname (map "opt_$_", split '', q{mhlvriFfXqnTd}) {
+foreach my $subname (map "opt_$_", split '', q{mhlvriFfXqnTdU}) {
no strict 'refs';
*$subname = do{ use strict 'refs'; sub () { shift->_elem($subname, @_) } };
}
exit;
}
-sub opt_U {} # legacy no-op
-
sub opt_t { # choose plaintext as output format
my $self = shift;
$self->opt_o_with('text') if @_ and $_[0];
my $callsub = (caller(1))[3];
my $package = quotemeta(__PACKAGE__ . '::');
$callsub =~ s/^$package/'/os;
+ # the o is justified, as $package really won't change.
$callsub . ": ";
} : '',
@_,
$self->opt_M_with('Pod::Perldoc::ToPod'); # the always-there fallthru
$self->opt_o_with('text');
$self->opt_o_with('man') unless IS_MSWin32 || IS_Dos
- || !($ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i);
+ || !($ENV{TERM} && (
+ ($ENV{TERM} || '') !~ /dumb|emacs|none|unknown/i
+ ));
return;
}
$file =~ s/\.(pm|pod)\z//; # XXX: badfs
print STDERR "\tperldoc $_\::$file\n";
}
- closedir DIR or die "closedir $dir: $!";
+ closedir(DIR) or die "closedir $dir: $!";
}
}
}
or die("Can't open $perlfunc: $!");
# Functions like -r, -e, etc. are listed under `-X'.
- my $search_string = ($self->opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
- ? 'I<-X' : $self->opt_f ;
-
+ my $search_re = ($self->opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
+ ? '(?:I<)?-X' : quotemeta($self->opt_f) ;
+
DEBUG > 2 and
- print "Going to perlfunc-scan for $search_string in $perlfunc\n";
-
+ print "Going to perlfunc-scan for $search_re in $perlfunc\n";
# Skip introduction
local $_;
my $found = 0;
my $inlist = 0;
while (<PFUNC>) { # "The Mothership Connection is here!"
- if (/^=item\s+\Q$search_string\E\b/o) {
+ if ( m/^=item\s+$search_re\b/ ) {
$found = 1;
}
elsif (/^=item/) {
my $found = 0;
my %found_in;
my $search_key = $self->opt_q;
- my $rx = eval { qr/$search_key/ } or die <<EOD;
+
+ my $rx = eval { qr/$search_key/ }
+ or die <<EOD;
Invalid regular expression '$search_key' given as -q pattern:
$@
Did you mean \\Q$search_key ?
local $_;
foreach my $file (@$found_things) {
die "invalid file spec: $!" if $file =~ /[<>|]/;
- open(INFAQ, "<", $file) or die "Can't read-open $file: $!\nAborting";
+ open(INFAQ, "<", $file) # XXX 5.6ism
+ or die "Can't read-open $file: $!\nAborting";
while (<INFAQ>) {
- if (/^=head2\s+.*(?:$search_key)/oi) { # it's good for only one key
+ if ( m/^=head2\s+.*(?:$search_key)/i ) {
$found = 1;
push @$pod, "=head1 Found in $file\n\n" unless $found_in{$file}++;
}
$fh = Symbol::gensym();
}
DEBUG > 3 and print "About to try making temp file $spec\n";
- return($fh, $spec) if open($fh, ">", $spec);
+ return($fh, $spec) if open($fh, ">", $spec); # XXX 5.6ism
$self->aside("Can't create temp file $spec: $!\n");
}
local $_;
my $any_error = 0;
foreach my $output (@found) {
- unless( open(TMP, "<", $output) ) {
+ unless( open(TMP, "<", $output) ) { # XXX 5.6ism
warn("Can't open $output: $!");
$any_error = 1;
next;
sub containspod {
my($self, $file, $readit) = @_;
return 1 if !$readit && $file =~ /\.pod\z/i;
+
+
+ # Under cygwin the /usr/bin/perl is legal executable, but
+ # you cannot open a file with that name. It must be spelled
+ # out as "/usr/bin/perl.exe".
+ #
+ # The following if-case under cygwin prevents error
+ #
+ # $ perldoc perl
+ # Cannot open /usr/bin/perl: no such file or directory
+ #
+ # This would work though
+ #
+ # $ perldoc perl.pod
+
+ if ( IS_Cygwin and -x $file and -f "$file.exe" )
+ {
+ warn "Cygwin $file.exe search skipped\n" if DEBUG or $self->opt_v;
+ return 0;
+ }
+
local($_);
- open(TEST,"<", $file) or die "Can't open $file: $!";
+ open(TEST,"<", $file) or die "Can't open $file: $!"; # XXX 5.6ism
while (<TEST>) {
if (/^=head/) {
close(TEST) or die "Can't close $file: $!";
$fh = Symbol::gensym();
}
DEBUG > 3 and print "About to try writing to specified output file $outspec\n";
- die "Can't write-open $outspec: $!" unless open($fh, ">", $outspec);
+ die "Can't write-open $outspec: $!"
+ unless open($fh, ">", $outspec); # XXX 5.6ism
+
DEBUG > 3 and print "Successfully opened $outspec\n";
binmode($fh) if $self->{'output_is_binary'};
return($fh, $outspec);
my ($self, $output, $output_to_stdout, @pagers) = @_;
if ($output_to_stdout) {
$self->aside("Sending unpaged output to STDOUT.\n");
- open(TMP, "<", $output) or die "Can't open $output: $!";
+ open(TMP, "<", $output) or die "Can't open $output: $!"; # XXX 5.6ism
local $_;
while (<TMP>) {
print or die "Can't print to stdout: $!";
$< = $id; # real uid
$> = $id; # effective uid
};
- die "Superuser must not run $0 without security audit and taint checks.\n"
- unless !$@ && $< && $>;
+ if( !$@ && $< && $> ) {
+ DEBUG and print "OK, I dropped privileges.\n";
+ } elsif( $self->opt_U ) {
+ DEBUG and print "Couldn't drop privileges, but in -U mode, so feh."
+ } else {
+ DEBUG and print "Hm, couldn't drop privileges. Ah well.\n";
+ # We used to die here; but that seemed pointless.
+ }
}
return;
}
# is embedded in the perl installation tree.
#
#~~~~~~
-# Version 3.06: Sunday November 17 2002 -- 14:05:28
-# Sean M. Burke <sburke@cpan.org>
-# Added -V to report version
-# Restore -U as a no-op legacy switch.
+#
+# See ChangeLog in CPAN dist for Pod::Perldoc for later notes.
#
# Version 3.01: Sun Nov 10 21:38:09 MST 2002
# Sean M. Burke <sburke@cpan.org>
# it'll run faster.
#
# Version 1.01: Tue May 30 14:47:34 EDT 1995
-# Andy Dougherty <doughera@lafayette.edu>
+# Andy Dougherty <doughera@lafcol.lafayette.edu>
# -added pod documentation.
# -added PATH searching.
# -added searching pod/ subdirectory (mainly to pick up perlfunc.pod