diff options
-rw-r--r-- | configdata.pm.in | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/configdata.pm.in b/configdata.pm.in index 6c0d30baa0..57ad440fa4 100644 --- a/configdata.pm.in +++ b/configdata.pm.in @@ -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; |