diff options
author | Benjamin Barenblat <bbarenblat@gmail.com> | 2020-10-11 12:04:39 -0400 |
---|---|---|
committer | Benjamin Barenblat <bbarenblat@gmail.com> | 2020-10-11 12:04:39 -0400 |
commit | e662f34ef65a3ae94b4216097acc9f0a25611fac (patch) | |
tree | 37f840729de08066fb4fcac739188a00200781bc /scoville.cc | |
parent | 4cd5b689a20b88258242e6c40314c16bd3e2194e (diff) |
Eliminate CMake; flatten directory structure
CMake is probably more trouble than it’s worth for this project.
Replace it with a hand-rolled Ninja file.
Diffstat (limited to 'scoville.cc')
-rw-r--r-- | scoville.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/scoville.cc b/scoville.cc new file mode 100644 index 0000000..2eff02e --- /dev/null +++ b/scoville.cc @@ -0,0 +1,61 @@ +// Copyright (C) 2007, 2008 Jan Engelhardt <jengelh@medozas.de> +// Copyright (C) 2016 Benjamin Barenblat <benjamin@barenblat.name> +// +// 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 <http://www.gnu.org/licenses/>. + +#include <memory> +#include <system_error> +#include <vector> + +#include <fcntl.h> +#include <gflags/gflags.h> +#include <glog/logging.h> + +#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<scoville::File> 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<char*> 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); +} |