Add test for no change following an HRR
[openssl.git] / util / mkdir-p.pl
index 2c003d6e8491369f9d49a6f0aff8fd0b3ac96849..328060243f3c5ad18f30803ce3716cc1cdfe86fe 100755 (executable)
@@ -1,6 +1,10 @@
-#!/usr/local/bin/perl
-
-# mkdir-p.pl
+#! /usr/bin/env perl
+# Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the OpenSSL license (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
 
 # On some systems, the -p option to mkdir (= also create any missing parent
 # directories) is not available.
@@ -8,6 +12,7 @@
 my $arg;
 
 foreach $arg (@ARGV) {
+  $arg =~ tr|\\|/|;
   &do_mkdir_p($arg);
 }
 
@@ -15,19 +20,25 @@ foreach $arg (@ARGV) {
 sub do_mkdir_p {
   local($dir) = @_;
 
-  $dir =~ s|/*$||;
+  $dir =~ s|/*\Z(?!\n)||s;
 
   if (-d $dir) {
     return;
   }
 
-  if ($dir =~ /\//) {
+  if ($dir =~ m|[^/]/|s) {
     local($parent) = $dir;
-    $parent =~ s|[^/]*$||;
+    $parent =~ s|[^/]*\Z(?!\n)||s;
 
     do_mkdir_p($parent);
   }
 
-  mkdir($dir, 0777) || die "Cannot create directory $dir: $!\n";
-  print "created directory $dir\n";
+  unless (mkdir($dir, 0777)) {
+    if (-d $dir) {
+      # We raced against another instance doing the same thing.
+      return;
+    }
+    die "Cannot create directory $dir: $!\n";
+  }
+  print "created directory `$dir'\n";
 }