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; }