status_t Format(const std::string& source) { std::vector<std::string> cmd; cmd.push_back(kMkfsPath); cmd.push_back(source); return ForkExecvp(cmd); }
status_t Format(const std::string& source, unsigned long numSectors) { std::vector<std::string> cmd; cmd.push_back(kMkfsPath); cmd.push_back("-F"); cmd.push_back("32"); cmd.push_back("-O"); cmd.push_back("android"); cmd.push_back("-c"); cmd.push_back("64"); cmd.push_back("-A"); if (numSectors) { cmd.push_back("-s"); cmd.push_back(StringPrintf("%lu", numSectors)); } cmd.push_back(source); int rc = ForkExecvp(cmd); if (rc < 0) { SLOGE("Filesystem format failed due to logwrap error"); errno = EIO; return -1; } if (rc == 0) { SLOGI("Filesystem formatted OK"); return 0; } else { SLOGE("Format failed (unknown exit code %d)", rc); errno = EIO; return -1; } return 0; }
status_t Check(const std::string& source) { if (access(kFsckPath, X_OK)) { SLOGW("Skipping fs checks\n"); return 0; } int pass = 1; int rc = 0; do { std::vector<std::string> cmd; cmd.push_back(kFsckPath); cmd.push_back("-p"); cmd.push_back("-f"); cmd.push_back(source); // Fat devices are currently always untrusted rc = ForkExecvp(cmd, sFsckUntrustedContext); if (rc < 0) { SLOGE("Filesystem check failed due to logwrap error"); errno = EIO; return -1; } switch(rc) { case 0: SLOGI("Filesystem check completed OK"); return 0; case 2: SLOGE("Filesystem check failed (not a FAT filesystem)"); errno = ENODATA; return -1; case 4: if (pass++ <= 3) { SLOGW("Filesystem modified - rechecking (pass %d)", pass); continue; } SLOGE("Failing check after too many rechecks"); errno = EIO; return -1; case 8: SLOGE("Filesystem check failed (no filesystem)"); errno = ENODATA; return -1; default: SLOGE("Filesystem check failed (unknown exit code %d)", rc); errno = EIO; return -1; } } while (0); return 0; }
status_t Check(const std::string& source) { std::vector<std::string> cmd; cmd.push_back(kFsckPath); cmd.push_back("-a"); cmd.push_back(source); // f2fs devices are currently always trusted return ForkExecvp(cmd, sFsckContext); }