From b8c12af9dd761c5118b70b1e2952e6c1a63628a8 Mon Sep 17 00:00:00 2001 From: Muiez Ahmed Date: Mon, 13 Dec 2021 11:00:56 -0500 Subject: [PATCH] [SystemZ][z/OS] Fix handling of dirs with filesystem tests The aim of this patch is to fix the post processing that is happening on the temporary test directories upon scope exit. In particular, ~scoped_test_env aims to chmod and remove the temporary directories; however, bad symlinks are followed and we get "No such file or directory". FIX: use find as alternative to chmod and avoid -follow option. Attempting to remove read-only files on z/OS prompts a message asking for confirmation. FIX: use the -f option to delete read-only files immediately without asking for confirmation. Some libcxx tests such as libcxx/test/std/input.output/filesystems/cl ass.directory_entry/directory_entry.cons/path.pass.cpp set the dir permissions to none. In turn, recursively doing chmod (-R) does not set the file permissions needed to be able to remove the dir on z/OS only. FIX: use find as alternative to chmod -R, which does not run into this issue on z/OS. Differential Revision: https://reviews.llvm.org/D108326 --- libcxx/test/support/filesystem_test_helper.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libcxx/test/support/filesystem_test_helper.h b/libcxx/test/support/filesystem_test_helper.h index ea645e2..00f4701 100644 --- a/libcxx/test/support/filesystem_test_helper.h +++ b/libcxx/test/support/filesystem_test_helper.h @@ -139,11 +139,17 @@ struct scoped_test_env int ret = std::system(cmd.c_str()); assert(ret == 0); #else +#if defined(__MVS__) + // The behaviour of chmod -R on z/OS prevents recursive + // permission change for directories that do not have read permission. + std::string cmd = "find " + test_root.string() + " -exec chmod 777 {} \\;"; +#else std::string cmd = "chmod -R 777 " + test_root.string(); +#endif // defined(__MVS__) int ret = std::system(cmd.c_str()); assert(ret == 0); - cmd = "rm -r " + test_root.string(); + cmd = "rm -rf " + test_root.string(); ret = std::system(cmd.c_str()); assert(ret == 0); #endif -- 2.7.4