Ext2File *Ext2Partition::read_dir(EXT2DIRENT *dirent) { string filename; Ext2File *newEntry; char *pos; int ret; if(!dirent) return NULL; if(!dirent->dirbuf) { dirent->dirbuf = (EXT2_DIR_ENTRY *) new char[blocksize]; if(!dirent->dirbuf) return NULL; ret = read_data_block(&dirent->parent->inode, dirent->next_block, dirent->dirbuf); if(ret < 0) return NULL; dirent->next_block++; } again: if(!dirent->next) dirent->next = dirent->dirbuf; else { pos = (char *) dirent->next; dirent->next = (EXT2_DIR_ENTRY *)(pos + dirent->next->rec_len); if(IS_BUFFER_END(dirent->next, dirent->dirbuf, blocksize)) { dirent->next = NULL; if(dirent->read_bytes < dirent->parent->file_size) { //LOG("DIR: Reading next block %d parent %s\n", dirent->next_block, dirent->parent->file_name.c_str()); ret = read_data_block(&dirent->parent->inode, dirent->next_block, dirent->dirbuf); if(ret < 0) return NULL; dirent->next_block++; goto again; } return NULL; } } dirent->read_bytes += dirent->next->rec_len; filename.assign(dirent->next->name, dirent->next->name_len); if((filename.compare(".") == 0) || (filename.compare("..") == 0)) goto again; newEntry = read_inode(dirent->next->inode); if(!newEntry) { LOG("Error reading Inode %d parent inode %d.\n", dirent->next->inode, dirent->parent->inode_num); return NULL; } newEntry->file_type = dirent->next->filetype; newEntry->file_name = filename; return newEntry; }
ExtFile *Partition::ReadDirectory(EXT2DIRENT *dirent) { string filename; ExtFile *newEntry; char *pos; int ret; if(!dirent) return NULL; if(!dirent->dirbuf) { dirent->dirbuf = (EXT2_DIR_ENTRY *) new char[blocksize]; if(!dirent->dirbuf) return NULL; ret = ReadDataBlock(&dirent->parent->inode, dirent->next_block, dirent->dirbuf); if(ret < 0) return NULL; dirent->next_block++; } again: if(!dirent->next) dirent->next = dirent->dirbuf; else { pos = (char *) dirent->next; dirent->next = (EXT2_DIR_ENTRY *)(pos + dirent->next->rec_len); if(IS_BUFFER_END(dirent->next, dirent->dirbuf, blocksize)) { dirent->next = NULL; if(dirent->read_bytes < dirent->parent->file_size) { ret = ReadDataBlock(&dirent->parent->inode, dirent->next_block, dirent->dirbuf); if(ret < 0) return NULL; dirent->next_block++; goto again; } return NULL; } } dirent->read_bytes += dirent->next->rec_len; filename.assign(dirent->next->name, dirent->next->name_len); if((filename.compare(".") == 0) || (filename.compare("..") == 0)) goto again; newEntry = ReadInode(dirent->next->inode); if(!newEntry) { LOG("Помилка читання Inode %d батьківський inode %d.\n", dirent->next->inode, dirent->parent->inode_num); return NULL; } newEntry->file_type = dirent->next->filetype; newEntry->file_name = filename; return newEntry; }