# # # patch "file_io.cc" # from [c0183255b52bcc7db9f9fc4626b4393fc9502ec1] # to [358fb964dc42e7f936a136342b93bb3a4744d1b3] # # patch "lua.cc" # from [86dd5f2354857f44b75a7c2c229bad870031b562] # to [7bdc5718a8d1db646ab3093d05cb8faa65e4fd0e] # # patch "platform.hh" # from [bd5be744c791a66527b0184fa5dbc5d8ec94e223] # to [5416e93a52cebdf882b7a6692b89e3b2aacb7562] # # patch "tester.cc" # from [5cee0a95f73730e9569b036fc9f129709ccc0058] # to [f96149cc40286220a17e2c8713fdb94aa0f35118] # # patch "unix/fs.cc" # from [fd280df80c6829c787f99fe1bc3748c7530ffacd] # to [93ee1436d888601196b81264f2c4fe3304c4bd64] # # patch "win32/fs.cc" # from [918ede5caf8f3f46fb54f462d29610713adf2339] # to [ea9b04b9ff4e1dccca546b1e63fd00beb8843c29] # ============================================================ --- file_io.cc c0183255b52bcc7db9f9fc4626b4393fc9502ec1 +++ file_io.cc 358fb964dc42e7f936a136342b93bb3a4744d1b3 @@ -125,7 +125,7 @@ directory_empty(any_path const & path) { directory_empty_helper h; try { - do_read_directory(system_path(path).as_external(), h, h); + do_read_directory(system_path(path).as_external(), h, h, h); } catch (directory_not_empty_exception) { return false; } @@ -264,7 +264,7 @@ do_remove_recursive(any_path const & p) fill_pc_vec subdir_fill(subdirs); file_deleter delete_files(p); - do_read_directory(p.as_external(), delete_files, subdir_fill); + do_read_directory(p.as_external(), delete_files, subdir_fill, delete_files); for (vector::const_iterator i = subdirs.begin(); i != subdirs.end(); i++) do_remove_recursive(p / *i); @@ -345,8 +345,10 @@ void read_directory(any_path const & pat vector & files, vector & dirs) { - fill_pc_vec ff(files), df(dirs); - do_read_directory(path.as_external(), ff, df); + vector special_files; + fill_pc_vec ff(files), df(dirs), sf(special_files); + do_read_directory(path.as_external(), ff, df, sf); + E(special_files.empty(), F("cannot handle special files in dir '%s'") % path); } // This function can only be called once per run. ============================================================ --- lua.cc 86dd5f2354857f44b75a7c2c229bad870031b562 +++ lua.cc 7bdc5718a8d1db646ab3093d05cb8faa65e4fd0e @@ -584,7 +584,7 @@ run_directory(lua_State * st, char const { ignore_directories id; record_if_matches rim(path, pattern, arr); - do_read_directory(path, rim, id); + do_read_directory(path, rim, id, id); } sort(arr.begin(), arr.end()); ============================================================ --- platform.hh bd5be744c791a66527b0184fa5dbc5d8ec94e223 +++ platform.hh 5416e93a52cebdf882b7a6692b89e3b2aacb7562 @@ -125,7 +125,8 @@ void do_read_directory(std::string const }; void do_read_directory(std::string const & path, dirent_consumer & files, - dirent_consumer & dirs); + dirent_consumer & dirs, + dirent_consumer & other_files); void rename_clobberingly(std::string const & from, std::string const & to); void do_remove(std::string const & path); ============================================================ --- tester.cc 5cee0a95f73730e9569b036fc9f129709ccc0058 +++ tester.cc f96149cc40286220a17e2c8713fdb94aa0f35118 @@ -383,7 +383,7 @@ void do_remove_recursive(string const & struct fill_vec get_subdirs(subdirs); struct file_deleter del_files(p); - do_read_directory(p, del_files, get_subdirs); + do_read_directory(p, del_files, get_subdirs, del_files); for(vector::const_iterator i = subdirs.begin(); i != subdirs.end(); i++) do_remove_recursive(p + "/" + *i); @@ -412,7 +412,7 @@ void do_make_tree_accessible(string cons struct fill_vec get_subdirs(subdirs); struct file_accessible_maker access_files(p); - do_read_directory(p, access_files, get_subdirs); + do_read_directory(p, access_files, get_subdirs, access_files); for(vector::const_iterator i = subdirs.begin(); i != subdirs.end(); i++) do_make_tree_accessible(p + "/" + *i); @@ -455,11 +455,12 @@ void do_copy_recursive(string const & fr if (fromstat == path::directory) { - vector subdirs; - struct fill_vec get_subdirs(subdirs); + vector subdirs, specials; + struct fill_vec get_subdirs(subdirs), get_specials(specials); struct file_copier copy_files(from, to); - do_read_directory(from, copy_files, get_subdirs); + do_read_directory(from, copy_files, get_subdirs, get_specials); + E(specials.empty(), F("cannot copy special files in '%s'") % from); for (vector::const_iterator i = subdirs.begin(); i != subdirs.end(); i++) do_copy_recursive(from + "/" + *i, to + "/" + *i); @@ -730,7 +731,7 @@ LUAEXT(read_directory, ) string path(luaL_checkstring(L, -1)); build_table tbl(L); - do_read_directory(path, tbl, tbl); + do_read_directory(path, tbl, tbl, tbl); } catch(informative_failure &) { ============================================================ --- unix/fs.cc fd280df80c6829c787f99fe1bc3748c7530ffacd +++ unix/fs.cc 93ee1436d888601196b81264f2c4fe3304c4bd64 @@ -145,7 +145,8 @@ do_read_directory(string const & path, void do_read_directory(string const & path, dirent_consumer & files, - dirent_consumer & dirs) + dirent_consumer & dirs, + dirent_consumer & specials) { string p(path); if (p == "") @@ -172,10 +173,8 @@ do_read_directory(string const & path, case DT_UNKNOWN: // unknown type case DT_LNK: // symlink - must find out what's at the other end - break; - default: - goto bad_special_file; + break; } #endif @@ -209,12 +208,9 @@ do_read_directory(string const & path, else if (S_ISDIR(st.st_mode)) dirs.consume(d->d_name); else - goto bad_special_file; + specials.consume(d->d_name); } return; - - bad_special_file: - E(false, F("cannot handle special file '%s/%s'") % p % d->d_name); } ============================================================ --- win32/fs.cc 918ede5caf8f3f46fb54f462d29610713adf2339 +++ win32/fs.cc ea9b04b9ff4e1dccca546b1e63fd00beb8843c29 @@ -199,7 +199,8 @@ do_read_directory(std::string const & pa void do_read_directory(std::string const & path, dirent_consumer & files, - dirent_consumer & dirs) + dirent_consumer & dirs, + dirent_consumer & /* specials */) { dirhandle dir(path); WIN32_FIND_DATA d;