// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { int do_minfs_check(fbl::unique_ptr bc, const minfs::Options& options) { return minfs_check(fbl::move(bc)); } int do_minfs_mount(fbl::unique_ptr bc, const minfs::Options& options) { zx_handle_t h = zx_take_startup_handle(PA_HND(PA_USER0, 0)); if (h == ZX_HANDLE_INVALID) { FS_TRACE_ERROR("minfs: Could not access startup handle to mount point\n"); return ZX_ERR_BAD_STATE; } async::Loop loop(&kAsyncLoopConfigNoAttachToThread); trace::TraceProvider trace_provider(loop.dispatcher()); auto loop_quit = [&loop]() { loop.Quit(); }; zx_status_t status; if ((status = MountAndServe(&options, loop.dispatcher(), fbl::move(bc), zx::channel(h), fbl::move(loop_quit)) != ZX_OK)) { if (options.verbose) { fprintf(stderr, "minfs: Failed to mount: %d\n", status); } return -1; } if (options.verbose) { fprintf(stderr, "minfs: Mounted successfully\n"); } loop.Run(); return 0; } int do_minfs_mkfs(fbl::unique_ptr bc, const minfs::Options& options) { return Mkfs(options, fbl::move(bc)); } struct { const char* name; int (*func)(fbl::unique_ptr bc, const minfs::Options&); uint32_t flags; const char* help; } CMDS[] = { {"create", do_minfs_mkfs, O_RDWR | O_CREAT, "initialize filesystem"}, {"mkfs", do_minfs_mkfs, O_RDWR | O_CREAT, "initialize filesystem"}, {"check", do_minfs_check, O_RDONLY, "check filesystem integrity"}, {"fsck", do_minfs_check, O_RDONLY, "check filesystem integrity"}, }; int usage() { fprintf(stderr, "usage: minfs [