Exemplo n.º 1
0
  private boolean open_filesystem(File f) throws IOException {
    boolean ret = true;
    RandomAccessFile rw = null;

    rw = new RandomAccessFile(f, "rw");

    fFileRWList.add(rw);

    // Read the root block
    byte tmp[] = new byte[BLK_SIZE];
    readBlock("rootFile", 0, tmp);

    SVDBFileSystemDataInput in = new SVDBFileSystemDataInput();
    in.addPage(tmp);

    /**
     * Root block is: - Magic number - Filesystem version-string length - Filesystem version
     * (string) - Number of storage files in this filesystem - Block length of the last file -
     * Handle to the alloc list - Alloc list length - Handle to the file-info list - File-info list
     * length - user data length - user data
     */
    int magic_number = in.readInt();

    if (magic_number != VALID_MAGIC_NUMBER) {
      ret = false;
    } else {
      String version = in.readString();

      if (!fVersion.equals(version)) {
        // Version doesn't match, so re-initialize the filesystem
        ret = false;
        cleanup();
        initialize();
      } else {
        int n_files = in.readInt();
        fLastRwBlkLen = in.readInt();
        fAllocListFile = in.readInt();
        int alloc_list_len = in.readInt();

        // Read back the file list;
        fFileInfoHndl = in.readInt();
        int file_list_size = in.readInt();

        if (fTrackFiles) {
          fTrackFiles = false;
          SVDBFileSystemDataInput file_info_in = readFile("fileInfo", fFileInfoHndl);
          fTrackFiles = true;

          fFileList.clear();
          for (int i = 0; i < file_list_size; i++) {
            FileInfo info = new FileInfo();
            info.fFileId = file_info_in.readInt();
            int n_blocks = file_info_in.readInt();
            for (int j = 0; j < n_blocks; j++) {
              info.fBlockIdList.add(file_info_in.readInt());
            }
            fFileList.add(info);
          }
        }

        int ud_len = in.readInt();

        if (ud_len == -1) {
          fUserData = null;
        } else {
          fUserData = new byte[ud_len];
          in.readFully(fUserData);
        }

        for (int i = 2; i <= n_files; i++) {
          f = new File(fDBDir, i + ".db");
          rw = new RandomAccessFile(f, "rw");
          fFileRWList.add(rw);
        }

        // Now we can read in the alloc list and initialize the AllocList
        boolean track_files = fTrackFiles;
        fTrackFiles = false;
        SVDBFileSystemDataInput alloc_in = readFile("allocList", fAllocListFile);
        fTrackFiles = track_files;
        fAllocList = new byte[alloc_list_len];
        alloc_in.readFully(fAllocList);

        if (fTrackFiles) {
          for (int i = 0; i < fAllocList.length; i++) {
            if ((i % 16) == 0) {
              if (i != 0) {
                System.out.println();
              }
              System.out.print("" + i + ": ");
            }
            System.out.print(Integer.toHexString(fAllocList[i]) + " ");
          }
          System.out.println();

          System.out.println("--> Validate Initial Load alloc_list_len=" + alloc_list_len);
          removeFileInfo(null);
          System.out.println("<-- Validate Initial Load");
        }
      }
    }

    if (ret) {
      // Mark the filesystem as open and invalid. This enables us to
      // detect filesystem invalidity due to improper close
      write32(0, tmp, ~VALID_MAGIC_NUMBER);
      writeBlock("rootBlock", 0, tmp);
    }

    return ret;
  }