// delete a file. // return success if we deleted it or it didn't exist in the first place // static int delete_project_owned_file_aux(const char* path) { #ifdef _WIN32 if (DeleteFile(path)) return 0; int error = GetLastError(); if (error == ERROR_FILE_NOT_FOUND) { return 0; } if (error == ERROR_ACCESS_DENIED) { SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL); if (DeleteFile(path)) return 0; } return error; #else int retval = unlink(path); if (retval == 0) return 0; if (errno == ENOENT) { return 0; } if (g_use_sandbox && (errno == EACCES)) { // We may not have permission to read subdirectories created by projects // return remove_project_owned_file_or_dir(path); } return ERR_UNLINK; #endif }
// recursively delete everything in the specified directory // (but not the directory itself). // If an error occurs, delete as much as possible. // int client_clean_out_dir( const char* dirpath, const char* reason, const char* except ) { char filename[MAXPATHLEN], path[MAXPATHLEN]; int retval, final_retval = 0; DIRREF dirp; if (reason && log_flags.slot_debug) { msg_printf(0, MSG_INFO, "[slot] cleaning out %s: %s", dirpath, reason); } dirp = dir_open(dirpath); if (!dirp) { #ifndef _WIN32 if (g_use_sandbox && (errno == EACCES)) { // dir may be owned by boinc_apps return remove_project_owned_file_or_dir(dirpath); } #endif return 0; // if dir doesn't exist, it's empty } while (1) { safe_strcpy(filename, ""); retval = dir_scan(filename, dirp, sizeof(filename)); if (retval) { if (retval != ERR_NOT_FOUND) { if (log_flags.slot_debug) { msg_printf(0, MSG_INFO, "[slot] dir_scan(%s) failed: %s", dirpath, boincerror(retval) ); } final_retval = retval; } break; } if (except && !strcmp(except, filename)) { continue; } snprintf(path, sizeof(path), "%s/%s", dirpath, filename); if (is_dir(path)) { retval = client_clean_out_dir(path, NULL); if (retval) final_retval = retval; retval = remove_project_owned_dir(path); if (retval) final_retval = retval; } else { retval = delete_project_owned_file(path, false); if (retval) final_retval = retval; } } dir_close(dirp); return final_retval; }
int remove_project_owned_dir(const char* name) { #ifdef _WIN32 if (!RemoveDirectory(name)) { return GetLastError(); } return 0; #else int retval; retval = rmdir(name); // We may not have permission to read subdirectories created by projects if (retval && g_use_sandbox && (errno == EACCES)) { retval = remove_project_owned_file_or_dir(name); } return retval; #endif }
/// Recursively delete everything in the specified directory. /// (but not the directory itself). /// If an error occurs, delete as much as possible. /// /// \param[in] dirpath Path to the directory that should be cleared. /// \return Zero on success, nonzero otherwise. int client_clean_out_dir(const char* dirpath) { int final_retval = 0; DIRREF dirp; dirp = dir_open(dirpath); if (!dirp) { #ifndef _WIN32 if (g_use_sandbox && (errno == EACCES)) { // dir may be owned by boinc_apps return remove_project_owned_file_or_dir(dirpath); } #endif return 0; // if dir doesn't exist, it's empty } while (true) { std::string filename; if (dir_scan(filename, dirp)) { break; } std::string path(dirpath); path.append("/").append(filename); int retval; if (is_dir(path.c_str())) { retval = client_clean_out_dir(path.c_str()); if (retval) { final_retval = retval; } retval = remove_project_owned_dir(path.c_str()); if (retval) { final_retval = retval; } } else { retval = delete_project_owned_file(path.c_str(), false); if (retval) { final_retval = retval; } } } dir_close(dirp); return final_retval; }
// recursively delete everything in the specified directory // (but not the directory itself). // If an error occurs, delete as much as possible. // int client_clean_out_dir(const char* dirpath, const char* reason) { char filename[256], path[256]; int retval, final_retval = 0; DIRREF dirp; if (reason && log_flags.slot_debug) { msg_printf(0, MSG_INFO, "[slot] cleaning out %s: %s", dirpath, reason); } dirp = dir_open(dirpath); if (!dirp) { #ifndef _WIN32 if (g_use_sandbox && (errno == EACCES)) { // dir may be owned by boinc_apps return remove_project_owned_file_or_dir(dirpath); } #endif return 0; // if dir doesn't exist, it's empty } while (1) { strcpy(filename, ""); retval = dir_scan(filename, dirp, sizeof(filename)); if (retval) break; sprintf(path, "%s/%s", dirpath, filename); if (is_dir(path)) { retval = client_clean_out_dir(path, NULL); if (retval) final_retval = retval; retval = remove_project_owned_dir(path); if (retval) final_retval = retval; } else { retval = delete_project_owned_file(path, false); if (retval) final_retval = retval; } } dir_close(dirp); return final_retval; }