예제 #1
0
void FileSystem::writeInodeEntry(PartitionEntry *partition,
                                 unsigned int inodeNumber) {
  InodeData inode = readInode(partition, lostFoundInode);
  InodeData inode_cur = readInode(partition, inodeNumber);
  int blockNumber = readDataBlocks(partition, lostFoundInode,
                                   (blockSize / SECTOR_SIZE_BYTES),
                                   inode.dataBlocksPointers, 0, 0, 2);
  if (blockNumber == -1)
    return;
  unsigned int blockSector = getBlockSector(partition, blockNumber);
  unsigned char buf[blockSize];
  unsigned int i = 0;
  readSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf);
  while (i < blockSize - 1) {
    struct ext2_dir_entry_2 *fileEntry = (struct ext2_dir_entry_2 *) (buf + i);
    if (fileEntry->rec_len
        > ((((__u16 ) 8 + fileEntry->name_len) + 3) & ~0x03)) {
      fileEntry->rec_len = (((__u16 ) 8 + fileEntry->name_len) + 3) & ~0x03;
      i = i + fileEntry->rec_len;
      fileEntry = (struct ext2_dir_entry_2*) (buf + i);
      fileEntry->inode = inodeNumber;
      sprintf(fileEntry->name, "%d", inodeNumber);
      fileEntry->rec_len = (__u16)(blockSize - i);
      fileEntry->name_len = (__u8)(strlen(fileEntry->name));
      if (!(inode_cur.fileType & EXT2_S_IFREG) == 0)
        fileEntry->file_type = 1;
      else if (!(inode_cur.fileType & EXT2_S_IFDIR) == 0)
        fileEntry->file_type = 2;
      writeSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf);
      return;
    } else {
      i = i + fileEntry->rec_len;
    }
  }
}
예제 #2
0
UmdReader::UmdReader(const QString name, QWidget *parent):QSplitter(parent)
{
    bookName=name;
    creatParser();
    creatWidget();
    readChapters();
    readDataBlocks();
    creatConnection();
}
예제 #3
0
void FileSystem::readRootInode(PartitionEntry *partition) {
  unsigned int i;
  InodeData inode = readInode(partition, 2);
  blockSize = 1024 << super_block.s_log_block_size;
  firstRootBataBlock = inode.dataBlocksPointers[0];
  readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 1, 1, 2);
  readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 2, 1, 2);
  for (i = 11; i <= super_block.s_inodes_count; i++) {
    InodeData in = readInode(partition, i);
    if (!(in.fileType & EXT2_S_IFDIR) == 0
        && checkInodeBitmap(partition, i) == 1) {
      readDataBlocks(partition, i, -1, in.dataBlocksPointers, 0, 2, 2);
    }
  }
  for (i = 11; i <= super_block.s_inodes_count; i++) {
    unsigned int bitmapValue = checkInodeBitmap(partition, i);
    if (bitmapValue == 1 && inodeMap[i] == 0) {
      InodeData in = readInode(partition, i);
      if (in.fileType != 0) {
        QString tmpStr = QString("Inode ") + QString::number(i)
            + QString(" has invalid entry in inode bitmap. Bitmap value: ")
            + QString::number(bitmapValue) + QString(", collected value:")
            + QString::number(inodeMap[i]) + QString(".\n");
        textBrowser->append(tmpStr);
        errorQt++;
        if (performRepair) {
          writeInodeEntry(partition, i);
        }
      }
    }
  }
  readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 1, 1, 2);
  readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 3, 1, 2);
  for (i = 1; i <= super_block.s_inodes_count; i++) {
    InodeData in = readInode(partition, i);
    if (inodeLinkCount[i] != in.hardLinksQt) {
      if (in.fileType != 0) {
        QString tmpStr = QString("Inode ") + QString::number(i)
            + QString(
                " has invalid inode count in inode entry. Current value : ")
            + QString::number(in.hardLinksQt) + QString(", collected value:")
            + QString::number(inodeLinkCount[i]) + QString(".\n");
        textBrowser->append(tmpStr);
        errorQt++;
      }
      if (performRepair) {
        UpdateHardLinkCounter(partition, i, inodeLinkCount[i]);
      }
    }
  }
  readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 4, 1, 2);
  for (i = 1; i <= super_block.s_blocks_count; i++) {
    unsigned int bitmapValue = checkBlockBitmap(partition, i);
    if (i < firstRootBataBlock && checkBlockBitmap(partition, i) == 0) {
      QString tmpStr =
          QString("Block ") + i
              + QString(
                  " has invalid entry in block bitmap. Bitmap value: 0, collected value: 1.\n");
      textBrowser->append(tmpStr);
      errorQt++;
      if (performRepair) {
        setBlockBitmap(partition, i);
      }
    }
    if (blockMap[i] == 1 && bitmapValue != blockMap[i]) {
      QString tmpStr = QString("Block ") + QString::number(i)
          + QString(" has invalid entry in block bitmap. Bitmap value: ")
          + QString::number(bitmapValue) + QString(", collected value: ")
          + QString::number(blockMap[i]) + QString(".\n");
      textBrowser->append(tmpStr);
      errorQt++;
      if (performRepair) {
        setBlockBitmap(partition, i);
      }
    }
  }
}
예제 #4
0
unsigned int FileSystem::parseFilesystem(PartitionEntry *partition,
                                         unsigned int blockNumber,
                                         unsigned int passNumber,
                                         unsigned int currentInode,
                                         unsigned int parentInode,
                                         int performCheck) {
  unsigned char buf[blockSize];
  unsigned int i = 0;
  struct ext2_dir_entry_2 *fileEntry;
  unsigned int blockSector = getBlockSector(partition, blockNumber);
  readSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf);
  while (i < blockSize - 1) {

    fileEntry = (struct ext2_dir_entry_2 *) (buf + i);

    if (fileEntry->inode == 0)
      return -1;

    if (currentInode == 2 && parentInode == 2
        && (strcmp(fileEntry->name, "lost+found") == 0)) {
      lostFoundInode = fileEntry->inode;
    }

    if (passNumber == 1 && performCheck == 1) {
      if (fileEntry->inode != currentInode
          && (strcmp(fileEntry->name, ".") == 0)) {
        QString tmpStr = QString("Entry '.' has inode ")
            + QString::number(fileEntry->inode) + QString(" instead of ")
            + QString::number(currentInode) + QString(".\n");
        textBrowser->append(tmpStr);
        errorQt++;
        fileEntry->inode = currentInode;
        writeSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf);
      }
      if (fileEntry->inode != parentInode && (!strcmp(fileEntry->name, ".."))) {
        QString tmpStr = QString("Entry '..' has inode ")
            + QString::number(fileEntry->inode) + QString(" instead of ")
            + QString::number(parentInode) + QString(".\n");
        textBrowser->append(tmpStr);
        errorQt++;
        fileEntry->inode = parentInode;
        writeSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf);
      }
    } else if (passNumber == 2 && performCheck == 1) {
      inodeMap[fileEntry->inode] = 1;
    } else if (passNumber == 3 && performCheck == 1) {
      inodeLinkCount[fileEntry->inode] += 1;
    } else if (passNumber == 4 && performCheck == 1) {
      blockMap[blockNumber] = 1;
    }

    if (strcmp(fileEntry->name, ".") && strcmp(fileEntry->name, "..")
        && performCheck != 0) {
      if (performCheck == 2) {
        inodeMap[fileEntry->inode] = 1;
      }
      InodeData inode = readInode(partition, fileEntry->inode);
      if ((inode.fileType & 0xF000) == EXT2_S_IFREG && passNumber == 4) {
        readDataBlocks(partition, fileEntry->inode, currentInode,
                       inode.dataBlocksPointers, passNumber, performCheck, 1);
      } else if (!(inode.fileType & EXT2_S_IFDIR) == 0) {
        readDataBlocks(partition, fileEntry->inode, currentInode,
                       inode.dataBlocksPointers, passNumber, performCheck, 2);
      }
    }
    i = i + fileEntry->rec_len;
  }
  if (fileEntry != NULL && fileEntry->rec_len > 8 + fileEntry->name_len
      && (fileEntry->rec_len - 8 - fileEntry->name_len) > 16 && !performCheck)
    return blockNumber;
  return -1;
}