1 # Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. 2 # 3 # Licensed under the Apache License 2.0 (the "License"). You may not use 4 # this file except in compliance with the License. You can obtain a copy 5 # in the file LICENSE in the source distribution or at 6 # https://www.openssl.org/source/license.html 7 8 =head1 NAME 9 10 OpenSSL::fallback - push directories to the end of @INC at compile time 11 12 =cut 13 14 package OpenSSL::fallback; 15 16 use strict; 17 use warnings; 18 use Carp; 19 20 our $VERSION = '0.01'; 21 22 =head1 SYNOPSIS 23 24 use OpenSSL::fallback LIST; 25 26 =head1 DESCRIPTION 27 28 This small simple module simplifies the addition of fallback directories 29 in @INC at compile time. 30 31 It is used to add extra directories at the end of perl's search path so 32 that later "use" or "require" statements will find modules which are not 33 located on perl's default search path. 34 35 This is similar to L<lib>, except the paths are I<appended> to @INC rather 36 than prepended, thus allowing the use of a newer module on perl's default 37 search path if there is one. 38 39 =head1 CAVEAT 40 41 Just like with B<lib>, this only works with Unix filepaths. 42 Just like with L<lib>, this doesn't mean that it only works on Unix, but that 43 non-Unix users must first translate their file paths to Unix conventions. 44 45 # VMS users wanting to put [.my.stuff] into their @INC should write: 46 use fallback 'my/stuff'; 47 48 =head1 NOTES 49 50 If you try to add a file to @INC as follows, you will be warned, and the file 51 will be ignored: 52 53 use fallback 'file.txt'; 54 55 The sole exception is the file F<MODULES.txt>, which must contain a list of 56 sub-directories relative to the location of that F<MODULES.txt> file. 57 All these sub-directories will be appended to @INC. 58 59 =cut 60 61 # Forward declare 62 sub glob; 63 64 use constant DEBUG => 0; 65 66 sub import { 67 shift; # Skip module name 68 69 foreach (@_) { 70 my $path = $_; 71 72 if ($path eq '') { 73 carp "Empty compile time value given to use fallback"; 74 next; 75 } 76 77 print STDERR "DEBUG: $path\n" if DEBUG; 78 79 unless (-e $path 80 && ($path =~ m/(?:^|\/)MODULES.txt/ || -d $path)) { 81 croak "Parameter to use fallback must be a directory, not a file"; 82 next; 83 } 84 85 my @dirs = (); 86 if (-f $path) { # It's a MODULES.txt file 87 (my $dir = $path) =~ s|/[^/]*$||; # quick dirname 88 open my $fh, $path or die "Could not open $path: $!\n"; 89 while (my $l = <$fh>) { 90 $l =~ s|\R$||; # Better chomp 91 my $d = "$dir/$l"; 92 my $checked = $d; 93 94 if ($^O eq 'VMS') { 95 # Some VMS unpackers replace periods with underscores 96 # We must be real careful not to convert the directories 97 # '.' and '..', though. 98 $checked = 99 join('/', 100 map { my $x = $_; 101 $x =~ s|\.|_|g 102 if ($x ne '..' && $x ne '.'); 103 $x } 104 split(m|/|, $checked)) 105 unless -e $checked && -d $checked; 106 } 107 croak "All lines in $path must be a directory, not a file: $l" 108 unless -e $checked && -d $checked; 109 push @INC, $checked; 110 } 111 } else { # It's a directory 112 push @INC, $path; 113 } 114 } 115 } 116 117 =head1 SEE ALSO 118 119 L<FindBin> - optional module which deals with paths relative to the source 120 file. 121 122 =head1 AUTHOR 123 124 Richard Levitte, 2019 125 126 =cut 127 128