summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/autom4te.in19
-rw-r--r--tests/tools.at20
2 files changed, 32 insertions, 7 deletions
diff --git a/bin/autom4te.in b/bin/autom4te.in
index febcdeea..4c2b905c 100644
--- a/bin/autom4te.in
+++ b/bin/autom4te.in
@@ -1012,12 +1012,21 @@ if ($freeze)
exit $exit_code;
}
-# We need our cache directory. Don't fail with parallel creation.
-if (! -d "$cache")
+# Ensure the cache directory exists.
+if (! mkdir ($cache, 0755))
{
- mkdir "$cache", 0755
- or -d "$cache"
- or fatal "cannot create $cache: $!";
+ # Snapshot $! immediately, the next few operations may clobber it.
+ my $eexist = $!{EEXIST};
+ my $errmsg = "$!";
+
+ # If mkdir failed with EEXIST, that means the *name* $cache
+ # already exists, but it might be the wrong kind of file.
+ if (! $eexist || ! -d $cache)
+ {
+ require Cwd;
+ my $cwd = Cwd::cwd();
+ fatal "cannot create $cache in $cwd: $errmsg";
+ }
}
# Open the index for update, and lock it. autom4te handles several
diff --git a/tests/tools.at b/tests/tools.at
index d32ad362..49710202 100644
--- a/tests/tools.at
+++ b/tests/tools.at
@@ -1534,20 +1534,36 @@ end-language: "Autoconf-without-aclocal-m4"
# A failed redirection may cause a status of 2 with FreeBSD sh.
AT_CHECK([(: > sub/some-file) || exit 1 && exit 77], 1, [ignore], [ignore])
-# Failure to create cache directory.
+# Failure to create cache directory due to access permissions.
AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
AT_CHECK([grep 'cannot create .*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([grep ': Permission denied' stderr], [0], [ignore])
AT_CHECK([test -f configure], [1])
+# Failure to create cache directory due to something else in the way.
chmod u+w sub
+: > sub/autom4te.cache
+AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
+AT_CHECK([grep 'cannot create .*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([grep ': File exists' stderr], [0], [ignore])
+AT_CHECK([test -f configure], [1])
+
+# This time, creation should succeed.
+rm -f sub/autom4te.cache
AT_CHECK_AUTOCONF
+AT_CHECK([test -d sub/autom4te.cache])
rm -f configure sub/autom4te.cache/*
chmod a-w sub/autom4te.cache
# Failure to create a file in the cache directory.
AT_CHECK_AUTOCONF([], [1], [ignore], [stderr])
-AT_CHECK([grep 'cannot open.*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([grep 'cannot open .*autom4te.cache' stderr], [0], [ignore])
+AT_CHECK([test -f configure], [1])
+
+# If the directory already exists, that should be fine.
+chmod u+w sub/autom4te.cache
+AT_CHECK_AUTOCONF
AT_CLEANUP