| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| #include "util.h" |
| |
| #include <minfs/fsck.h> |
| |
| #include <utility> |
| |
| void setup_fs_test(size_t disk_size) { |
| int r = open(MOUNT_PATH, O_RDWR | O_CREAT | O_EXCL, 0755); |
| |
| if (r < 0) { |
| fprintf(stderr, "Unable to create disk for test filesystem\n"); |
| exit(-1); |
| } |
| |
| if (ftruncate(r, disk_size) < 0) { |
| fprintf(stderr, "Unable to truncate disk\n"); |
| exit(-1); |
| } |
| |
| if (close(r) < 0) { |
| fprintf(stderr, "Unable to close disk\n"); |
| exit(-1); |
| } |
| |
| if (emu_mkfs(MOUNT_PATH) < 0) { |
| fprintf(stderr, "Unable to run mkfs\n"); |
| exit(-1); |
| } |
| |
| if (emu_mount(MOUNT_PATH) < 0) { |
| fprintf(stderr, "Unable to run mount\n"); |
| exit(-1); |
| } |
| } |
| |
| void teardown_fs_test() { |
| if (unlink(MOUNT_PATH) < 0) { |
| exit(-1); |
| } |
| } |
| |
| int run_fsck() { |
| fbl::unique_fd disk(open(MOUNT_PATH, O_RDONLY)); |
| |
| if (!disk) { |
| fprintf(stderr, "Unable to open disk for fsck\n"); |
| return -1; |
| } |
| |
| struct stat stats; |
| if (fstat(disk.get(), &stats) < 0) { |
| fprintf(stderr, "error: minfs could not find end of file/device\n"); |
| return 0; |
| } |
| |
| if (stats.st_size == 0) { |
| fprintf(stderr, "Invalid disk\n"); |
| return -1; |
| } |
| |
| size_t size = stats.st_size /= minfs::kMinfsBlockSize; |
| |
| fbl::unique_ptr<minfs::Bcache> block_cache; |
| if (minfs::Bcache::Create(&block_cache, std::move(disk), static_cast<uint32_t>(size)) < 0) { |
| fprintf(stderr, "error: cannot create block cache\n"); |
| return -1; |
| } |
| |
| return Fsck(std::move(block_cache)); |
| } |