| 202 | |
| 203 | private: |
| 204 | void mount() |
| 205 | { |
| 206 | _sectorSize = getLogicalSectorSize(); |
| 207 | _sectorsPerBlock = _sectorSize / _config.block_size(); |
| 208 | |
| 209 | _rootBlock = getLifBlock(0); |
| 210 | |
| 211 | ByteReader rbr(_rootBlock); |
| 212 | if (rbr.read_be16() != 0x8000) |
| 213 | throw BadFilesystemException(); |
| 214 | _volumeLabel = trimWhitespace(rbr.read(6)); |
| 215 | _directoryBlock = rbr.read_be32(); |
| 216 | rbr.skip(4); |
| 217 | _directorySize = rbr.read_be32(); |
| 218 | rbr.skip(4); |
| 219 | unsigned tracks = rbr.read_be32(); |
| 220 | unsigned heads = rbr.read_be32(); |
| 221 | unsigned sectors = rbr.read_be32(); |
| 222 | _usedBlocks = 1 + _directorySize; |
| 223 | |
| 224 | Bytes directory = getLifBlock(_directoryBlock, _directorySize); |
| 225 | |
| 226 | _dirents.clear(); |
| 227 | ByteReader br(directory); |
| 228 | while (!br.eof()) |
| 229 | { |
| 230 | Bytes direntBytes = br.read(32); |
| 231 | if (direntBytes[0] != 0xff) |
| 232 | { |
| 233 | auto dirent = std::make_unique<LifDirent>(_config, direntBytes); |
| 234 | _usedBlocks += dirent->length / _config.block_size(); |
| 235 | _dirents.push_back(std::move(dirent)); |
| 236 | } |
| 237 | } |
| 238 | _totalBlocks = std::max(tracks * heads * sectors, _usedBlocks); |
| 239 | } |
| 240 | |
| 241 | std::shared_ptr<LifDirent> findFile(const std::string filename) |
| 242 | { |
no test coverage detected