/** * * retro_dirent_is_dir: * @rdir : pointer to the directory entry. * @path : path to the directory entry. * * Is the directory listing entry a directory? * * Returns: true if directory listing entry is * a directory, false if not. */ bool retro_dirent_is_dir(struct RDIR *rdir, const char *path) { #if defined(_WIN32) const WIN32_FIND_DATA *entry = (const WIN32_FIND_DATA*)&rdir->entry; return entry->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; #elif defined(PSP) || defined(VITA) const SceIoDirent *entry = (const SceIoDirent*)&rdir->entry; #if defined(PSP) return (entry->d_stat.st_attr & FIO_SO_IFDIR) == FIO_SO_IFDIR; #elif defined(VITA) return PSP2_S_ISDIR(entry->d_stat.st_mode); #endif #elif defined(__CELLOS_LV2__) CellFsDirent *entry = (CellFsDirent*)&rdir->entry; return (entry->d_type == CELL_FS_TYPE_DIRECTORY); #elif defined(DT_DIR) const struct dirent *entry = (const struct dirent*)rdir->entry; if (entry->d_type == DT_DIR) return true; /* This can happen on certain file systems. */ if (entry->d_type == DT_UNKNOWN || entry->d_type == DT_LNK) return path_is_directory(path); return false; #else /* dirent struct doesn't have d_type, do it the slow way ... */ return path_is_directory(path); #endif }
DirectoryResult DirectoryNext(Directory directory, DirectoryEntry *entry) { DirectoryResult result = Directory_Error; if (directory == DirectoryInvalid) return Directory_Error; #if defined(_WIN32) DirectoryData *dirData = (DirectoryData*)directory; if (dirData->IsEnd == TRUE) return Directory_EndOfEntries; strncpy(entry->name, dirData->FindData.cFileName, MAX_PATH); entry->length = dirData->FindData.nFileSizeLow; bool isreadonly = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0; bool ishidden = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0; bool issystem = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) != 0; bool isdirectory = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; if (isdirectory) entry->length = -1; BOOL ret = FindNextFile(dirData->hDir, &dirData->FindData); if (ret == FALSE) { if (GetLastError() != ERROR_NO_MORE_FILES) return Directory_Error; dirData->IsEnd = TRUE; } result = Directory_Continue; #elif defined(PLATFORM_PSP2) SceIoDirent dir; int res = sceIoDread((SceUID)directory, &dir); if (res < 0) return Directory_Error; strcpy(entry->name, dir.d_name); if (PSP2_S_ISDIR(dir.d_stat.st_mode)) entry->length = -1; else entry->length = dir.d_stat.st_size; result = res == 0 ? Directory_EndOfEntries : Directory_Continue; #endif // Check for "." or ".." if (result == Directory_Continue) { if (entry->length < 0 && entry->name[0] == '.') { // Probably it's the directory pointer, do more checks if (entry->name[1] == '\0' || (entry->name[1] == '.' && entry->name[2] == '\0')) // it is, recursively call again DirectoryNext return DirectoryNext(directory, entry); } } return result; }
static void send_LIST(ClientInfo *client, const char *path) { char buffer[512]; SceUID dir; SceIoDirent dirent; dir = sceIoDopen(path); if (dir < 0) { client_send_ctrl_msg(client, "550 Invalid directory.\n"); return; } client_send_ctrl_msg(client, "150 Opening ASCII mode data transfer for LIST.\n"); client_open_data_connection(client); memset(&dirent, 0, sizeof(dirent)); while (sceIoDread(dir, &dirent) > 0) { gen_list_format(buffer, sizeof(buffer), PSP2_S_ISDIR(dirent.d_stat.st_mode), dirent.d_stat.st_size, dirent.d_stat.st_ctime.month, dirent.d_stat.st_ctime.day, dirent.d_stat.st_ctime.hour, dirent.d_stat.st_ctime.minute, dirent.d_name); client_send_data_msg(client, buffer); memset(&dirent, 0, sizeof(dirent)); memset(buffer, 0, sizeof(buffer)); } sceIoDclose(dir); DEBUG("Done sending LIST\n"); client_close_data_connection(client); client_send_ctrl_msg(client, "226 Transfer complete.\n"); }
static int file_list_build(const char *path, file_list *list, const char *supported_ext[]) { SceUID dir; SceIoDirent dirent; dir = sceIoDopen(path); if (dir < 0) { return 0; } memset(&dirent, 0, sizeof(dirent)); memset(list, 0, sizeof(*list)); while (sceIoDread(dir, &dirent) > 0) { file_list_entry *entry = (file_list_entry *)malloc(sizeof(*entry)); strcpy(entry->name, dirent.d_name); entry->is_dir = PSP2_S_ISDIR(dirent.d_stat.st_mode); if (!entry->is_dir) { entry->supported = file_supported(entry->name, supported_ext); } file_list_add_entry(list, entry); memset(&dirent, 0, sizeof(dirent)); } sceIoDclose(dir); file_list_entry *up = (file_list_entry *)malloc(sizeof(*up)); strcpy(up->name, ".."); up->is_dir = 1; up->next = NULL; file_list_add_entry(list, up); return 0; }