1 #ifndef DISK_H 2 #define DISK_H 3 /* Disk - handles BFS super block, disk access etc. 4 ** 5 ** Copyright (c) 2001-2003 pinc Software. All Rights Reserved. 6 */ 7 8 9 #include <File.h> 10 #include <Path.h> 11 12 #include <string.h> 13 14 #include "Bitmap.h" 15 #include "bfs.h" 16 #include "Cache.h" 17 18 19 class Disk; 20 21 class BlockRunCache : public Cache<block_run> 22 { 23 public: 24 BlockRunCache(Disk *disk); 25 // ~BlockRunCache(); 26 27 virtual Cacheable *NewCacheable(block_run run); 28 29 protected: 30 Disk *fDisk; 31 }; 32 33 34 class Disk : public BPositionIO 35 { 36 public: 37 Disk(const char *device, bool rawMode = false, off_t start = 0, off_t stop = -1); 38 virtual ~Disk(); 39 40 status_t InitCheck(); 41 const BPath &Path() const { return fPath; } 42 43 off_t Size() const { return fSize; } 44 off_t NumBlocks() const { return fSuperBlock.num_blocks; } 45 uint32 BlockSize() const { return fSuperBlock.block_size; } 46 uint32 BlockShift() const { return fSuperBlock.block_shift; } 47 uint32 AllocationGroups() const { return fSuperBlock.num_ags; } 48 uint32 AllocationGroupShift() const { return fSuperBlock.ag_shift; } 49 uint32 BitmapSize() const { return fBitmap.Size(); } 50 off_t LogSize() const; 51 52 disk_super_block *SuperBlock() { return &fSuperBlock; } 53 block_run Root() const { return fSuperBlock.root_dir; } 54 block_run Indices() const { return fSuperBlock.indices; } 55 block_run Log() const { return fSuperBlock.log_blocks; } 56 Bitmap *BlockBitmap() { return &fBitmap; } 57 58 const char *Name() const { return fSuperBlock.name; } 59 void SetName(const char *name) { strcpy(fSuperBlock.name,name); } 60 61 off_t ToOffset(block_run run) const { return ToBlock(run) << fSuperBlock.block_shift; } 62 off_t ToBlock(block_run run) const { return ((((off_t)run.allocation_group) << fSuperBlock.ag_shift) | (off_t)run.start); } 63 block_run ToBlockRun(off_t start,int16 length = 1) const; 64 65 uint8 *ReadBlockRun(block_run run); 66 67 status_t ScanForSuperBlock(off_t start = 0,off_t stop = -1); 68 status_t ValidateSuperBlock(); 69 status_t RecreateSuperBlock(); 70 71 status_t DumpBootBlockToFile(); 72 73 // BPositionIO methods 74 virtual ssize_t Read(void *buffer, size_t size); 75 virtual ssize_t Write(const void *buffer, size_t size); 76 77 virtual ssize_t ReadAt(off_t pos, void *buffer, size_t size); 78 virtual ssize_t WriteAt(off_t pos, const void *buffer, size_t size); 79 80 virtual off_t Seek(off_t position, uint32 seek_mode); 81 virtual off_t Position() const; 82 83 virtual status_t SetSize(off_t size); 84 85 protected: 86 status_t GetNextSpecialInode(char *,off_t *,off_t,bool); 87 void SaveInode(bfs_inode *,bool *,bfs_inode *,bool *,bfs_inode *); 88 status_t ScanForIndexAndRoot(bfs_inode *,bfs_inode *); 89 status_t DetermineBlockSize(); 90 status_t ValidateSuperBlock(disk_super_block &superBlock); 91 92 status_t LoadBootBlock(); 93 94 BFile fFile; 95 BPath fPath; 96 off_t fRawDiskOffset; 97 off_t fSize; 98 disk_super_block fSuperBlock; 99 Bitmap fBitmap; 100 101 block_run fValidBlockRun; 102 off_t fValidOffset; 103 off_t fLogStart; 104 105 BlockRunCache fCache; 106 107 bool fRawMode; 108 }; 109 110 #endif /* DISK_H */ 111