Add loaded dynamic ENGINEs to list.
[openssl.git] / tools / c_rehash.in
index 0c2d6b1f4c73bc92431dd40411f246f08ea84cc1..bfc4a69ed4bcd8cb384a9bdc1d445bfcdd9b367c 100644 (file)
@@ -7,6 +7,7 @@
 my $openssl;
 
 my $dir;
+my $prefix;
 
 if(defined $ENV{OPENSSL}) {
        $openssl = $ENV{OPENSSL};
@@ -15,13 +16,23 @@ if(defined $ENV{OPENSSL}) {
        $ENV{OPENSSL} = $openssl;
 }
 
-$ENV{PATH} .= ":$dir/bin";
+my $pwd;
+eval "require Cwd";
+if (defined(&Cwd::getcwd)) {
+       $pwd=Cwd::getcwd();
+} else {
+       $pwd=`pwd`; chomp($pwd);
+}
+my $path_delim = ($pwd =~ /^[a-z]\:/i) ? ';' : ':'; # DOS/Win32 or Unix delimiter?
+
+$ENV{PATH} = "$prefix/bin" . ($ENV{PATH} ? $path_delim . $ENV{PATH} : ""); # prefix our path
 
 if(! -x $openssl) {
        my $found = 0;
-       foreach (split /:/, $ENV{PATH}) {
+       foreach (split /$path_delim/, $ENV{PATH}) {
                if(-x "$_/$openssl") {
                        $found = 1;
+                       $openssl = "$_/$openssl";
                        last;
                }       
        }
@@ -34,11 +45,16 @@ if(! -x $openssl) {
 if(@ARGV) {
        @dirlist = @ARGV;
 } elsif($ENV{SSL_CERT_DIR}) {
-       @dirlist = split /:/, $ENV{SSL_CERT_DIR};
+       @dirlist = split /$path_delim/, $ENV{SSL_CERT_DIR};
 } else {
        $dirlist[0] = "$dir/certs";
 }
 
+if (-d $dirlist[0]) {
+       chdir $dirlist[0];
+       $openssl="$pwd/$openssl" if (!-x $openssl);
+       chdir $pwd;
+}
 
 foreach (@dirlist) {
        if(-d $_ and -w $_) {
@@ -100,8 +116,8 @@ sub check_file {
 
 sub link_hash_cert {
                my $fname = $_[0];
-               $fname =~ s/'/'\\''/;
-               my ($hash, $fprint) = `$openssl x509 -hash -fingerprint -noout -in '$fname'`;
+               $fname =~ s/'/'\\''/g;
+               my ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout -in "$fname"`;
                chomp $hash;
                chomp $fprint;
                $fprint =~ s/^.*=//;
@@ -122,7 +138,11 @@ sub link_hash_cert {
                if ($symlink_exists) {
                        symlink $fname, $hash;
                } else {
-                       system ("cp", $fname, $hash);
+                       open IN,"<$fname" or die "can't open $fname for read";
+                       open OUT,">$hash" or die "can't open $hash for write";
+                       print OUT <IN>; # does the job for small text files
+                       close OUT;
+                       close IN;
                }
                $hashlist{$hash} = $fprint;
 }
@@ -131,7 +151,8 @@ sub link_hash_cert {
 
 sub link_hash_crl {
                my $fname = $_[0];
-               my ($hash, $fprint) = `$openssl crl -hash -fingerprint -noout -in "$fname"`;
+               $fname =~ s/'/'\\''/g;
+               my ($hash, $fprint) = `"$openssl" crl -hash -fingerprint -noout -in '$fname'`;
                chomp $hash;
                chomp $fprint;
                $fprint =~ s/^.*=//;