static DECLCALLBACK(int) rtFsExtProbe(RTVFSFILE hVfsFile, uint32_t *puScore) { int rc = VINF_SUCCESS; uint64_t cbMedium = 0; *puScore = RTFILESYSTEM_MATCH_SCORE_UNSUPPORTED; rc = RTVfsFileGetSize(hVfsFile, &cbMedium); if (RT_SUCCESS(rc)) { if (cbMedium >= 2*sizeof(ExtSuperBlock)) { ExtSuperBlock SuperBlock; rc = RTVfsFileReadAt(hVfsFile, 1024, &SuperBlock, sizeof(ExtSuperBlock), NULL); if (RT_SUCCESS(rc)) { #if defined(RT_BIGENDIAN) /** @todo: Convert to host endianess. */ #endif if (SuperBlock.u16Signature == RTFILESYSTEM_EXT2_SIGNATURE) *puScore = RTFILESYSTEM_MATCH_SCORE_SUPPORTED; } } } return rc; }
static int tstRTFilesystem(RTTEST hTest, RTVFSFILE hVfsFile) { int rc = VINF_SUCCESS; RTVFS hVfs = NIL_RTVFS; RTTestSubF(hTest, "Create filesystem object"); rc = RTFilesystemVfsFromFile(hVfsFile, &hVfs); if (RT_FAILURE(rc)) { RTTestIFailed("RTFilesystemVfsFromFile -> %Rrc", rc); return rc; } /* Check all blocks. */ uint64_t off = 0; uint32_t cBlocksUsed = 0; uint32_t cBlocksUnused = 0; uint64_t cbFs = 0; rc = RTVfsFileGetSize(hVfsFile, &cbFs); if (RT_FAILURE(rc)) { RTTestIFailed("RTVfsFileGetSize -> %Rrc", rc); return rc; } while (off < cbFs) { bool fUsed = false; rc = RTVfsIsRangeInUse(hVfs, off, 1024, &fUsed); if (RT_FAILURE(rc)) { RTTestIFailed("RTVfsIsRangeInUse -> %Rrc", rc); break; } if (fUsed) cBlocksUsed++; else cBlocksUnused++; off += 1024; } if (RT_SUCCESS(rc)) RTTestIPrintf(RTTESTLVL_ALWAYS, "%u blocks used and %u blocks unused\n", cBlocksUsed, cBlocksUnused); RTVfsRelease(hVfs); return rc; }