Fixed a bug could not change the mode while the file was opened

This commit is contained in:
Takeshi Nakatani 2022-05-29 09:52:10 +00:00 committed by Andrew Gaul
parent 904682b856
commit ec7810f08e
2 changed files with 37 additions and 0 deletions

View File

@ -412,6 +412,9 @@ bool StatCache::AddStat(const std::string& key, headers_t& meta, bool forcedir,
// Updates only meta data if cached data exists. // Updates only meta data if cached data exists.
// And when these are updated, it also updates the cache time. // And when these are updated, it also updates the cache time.
// //
// Since the file mode may change while the file is open, it is
// updated as well.
//
bool StatCache::UpdateMetaStats(const std::string& key, headers_t& meta) bool StatCache::UpdateMetaStats(const std::string& key, headers_t& meta)
{ {
if(CacheSize < 1){ if(CacheSize < 1){
@ -446,6 +449,9 @@ bool StatCache::UpdateMetaStats(const std::string& key, headers_t& meta)
// Update time. // Update time.
SetStatCacheTime(ent->cache_date); SetStatCacheTime(ent->cache_date);
// Update only mode
ent->stbuf.st_mode = get_mode(meta);
return true; return true;
} }

View File

@ -1222,6 +1222,36 @@ function test_update_directory_time_subdir() {
rm -rf "${TEST_DIR}" rm -rf "${TEST_DIR}"
} }
# [NOTE]
# This test changes the file mode while creating/editing a new file,
# and finally closes it.
# Test with the sed command as it occurs when in place mode of the sed
# command. (If trying it with a standard C function(and shell script),
# it will be not the same result of sed, so sed is used.)
#
function test_update_chmod_opened_file() {
describe "Testing create, modify the file by sed in place mode"
# test file
local BEFORE_STRING_DATA; BEFORE_STRING_DATA="sed in place test : BEFORE DATA"
local AFTER_STRING_DATA; AFTER_STRING_DATA="sed in place test : AFTER DATA"
echo "${BEFORE_STRING_DATA}" > "${TEST_TEXT_FILE}"
# sed in place
sed -i -e 's/BEFORE DATA/AFTER DATA/g' "${TEST_TEXT_FILE}"
# compare result
local RESULT_STRING; RESULT_STRING=$(cat "${TEST_TEXT_FILE}")
if [ -z "${RESULT_STRING}" ] || [ "${RESULT_STRING}" != "${AFTER_STRING_DATA}" ]; then
echo "the file conversion by sed in place command failed."
return 1
fi
# clean up
rm_test_file "${ALT_TEST_TEXT_FILE}"
}
function test_rm_rf_dir { function test_rm_rf_dir {
describe "Test that rm -rf will remove directory with contents ..." describe "Test that rm -rf will remove directory with contents ..."
# Create a dir with some files and directories # Create a dir with some files and directories
@ -1890,6 +1920,7 @@ function add_all_tests {
add_tests test_update_directory_time_touch_a add_tests test_update_directory_time_touch_a
fi fi
add_tests test_update_directory_time_subdir add_tests test_update_directory_time_subdir
add_tests test_update_chmod_opened_file
add_tests test_rm_rf_dir add_tests test_rm_rf_dir
add_tests test_copy_file add_tests test_copy_file