int drive_file_free(DRIVE_FILE* file, BOOL recursive) { int retval; retval = 0; if (file->fd != -1) close(file->fd); if (file->dir != NULL) closedir(file->dir); if (file->delete_pending) { if (file->is_dir) { if (recursive) { if (!drive_file_remove_dir(file->fullpath)) { retval = EPERM; } } else { if (rmdir(file->fullpath) != 0) { retval = errno; } } } else { if (unlink(file->fullpath) != 0) { retval = errno; } } } free(file->pattern); free(file->fullpath); free(file); return retval; }
void drive_file_free(DRIVE_FILE* file) { if (file->fd != -1) close(file->fd); if (file->dir != NULL) closedir(file->dir); if (file->delete_pending) { if (file->is_dir) drive_file_remove_dir(file->fullpath); else unlink(file->fullpath); } free(file->pattern); free(file->fullpath); free(file); }
static BOOL drive_file_remove_dir(const char* path) { DIR* dir; char* p; struct STAT st; struct dirent* pdirent; BOOL ret = TRUE; dir = opendir(path); if (dir == NULL) return FALSE; pdirent = readdir(dir); while (pdirent) { if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0) { pdirent = readdir(dir); continue; } p = (char*) malloc(strlen(path) + strlen(pdirent->d_name) + 2); sprintf(p, "%s/%s", path, pdirent->d_name); if (STAT(p, &st) != 0) { DEBUG_WARN("stat %s failed.", p); ret = FALSE; } else if (S_ISDIR(st.st_mode)) { ret = drive_file_remove_dir(p); } else if (unlink(p) < 0) { DEBUG_WARN("unlink %s failed.", p); ret = FALSE; } else { ret = TRUE; } free(p); if (!ret) break; pdirent = readdir(dir); } closedir(dir); if (ret) { if (rmdir(path) < 0) { DEBUG_WARN("rmdir %s failed.", path); ret = FALSE; } } return ret; }