// Copyright (C) 2007, 2008 Jan Engelhardt // Copyright (C) 2016 Benjamin Barenblat // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more // details. // // You should have received a copy of the GNU General Public License along with // this program. If not, see . #include #include #include #include #include #include #include "fuse.h" #include "operations.h" #include "posix_extras.h" constexpr char kUsage[] = R"(allow forbidden characters on VFAT file systems usage: scoville [flags] target_dir [-- fuse_options])"; int main(int argc, char* argv[]) { google::InstallFailureSignalHandler(); google::SetUsageMessage(kUsage); google::ParseCommandLineFlags(&argc, &argv, true); google::InitGoogleLogging(argv[0]); // This is an overlay file system, which means once we start FUSE, the // underlying file system will be inaccessible through normal means. Open a // file descriptor to the underlying root now so we can still do operations on // it while it's overlayed. std::unique_ptr root; const char* const root_path = argv[argc - 1]; try { root.reset(new scoville::File(root_path, O_DIRECTORY)); } catch (const std::system_error& e) { LOG(FATAL) << "scoville: bad mount point `" << root_path << "': " << e.what(); } LOG(INFO) << "overlaying " << root->path(); const fuse_operations operations = scoville::FuseOperations(root.get()); // Add -o nonempty to argv so FUSE won't complain about overlaying. char hyphen_o[] = "-o"; char nonempty[] = "nonempty"; std::vector new_argv(argv, argv + argc); new_argv.emplace_back(hyphen_o); new_argv.emplace_back(nonempty); return fuse_main(new_argv.size(), new_argv.data(), &operations, nullptr); }