Fix configdata.pm.in's "use lib" for VMS

`use lib` needs Unix formatted paths.  For VMS, it means that we must
make sure to convert paths, and we may as well generalise it.

In this case, we need to adapt the functions sourcedir() and sourcefile()

Reviewed-by: Tim Hudson <tjh@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15317)
This commit is contained in:
Richard Levitte 2021-05-17 17:20:58 +02:00
parent a1181fbdd0
commit 0c1428f441

View File

@ -4,15 +4,39 @@
# We must make sourcedir() return an absolute path, because configdata.pm
# may be loaded as a module from any script in any directory, making
# relative paths untrustable. Because the result is used with 'use lib',
# we must ensure that it returns a Unix style path. Cwd::abs_path does
# that (File::Spec::Functions::rel2abs return O/S specific paths)
use File::Spec::Functions;
# we must ensure that it returns a Unix style path. Mixing File::Spec
# and File::Spec::Unix does just that.
use File::Spec::Unix;
use File::Spec;
use Cwd qw(abs_path);
sub _fixup_path {
my $path = shift;
# Make the path absolute at all times
$path = abs_path($path);
if ($^O eq 'VMS') {
# Convert any path of the VMS form VOLUME:[DIR1.DIR2]FILE to the
# Unix form /VOLUME/DIR1/DIR2/FILE, which is what VMS perl supports
# for 'use lib'.
# Start with spliting the native path
(my $vol, my $dirs, my $file) = File::Spec->splitpath($path);
my @dirs = File::Spec->splitdir($dirs);
# Reassemble it as a Unix path
$vol =~ s|:$||;
$dirs = File::Spec::Unix->catdir('', $vol, @dirs);
$path = File::Spec::Unix->catpath('', $dirs, $file);
}
return $path;
}
sub sourcedir {
return abs_path(catdir($config{sourcedir}, @_));
return _fixup_path(File::Spec->catdir($config{sourcedir}, @_))
}
sub sourcefile {
return abs_path(catfile($config{sourcedir}, @_));
return _fixup_path(File::Spec->catfile($config{sourcedir}, @_))
}
use lib sourcedir('util', 'perl');
use OpenSSL::Util;