Defer daemonization to Fuse, introduce Fuse::runInBackground() / Fuse::runInForeground()
This commit is contained in:
parent
15aabee1ae
commit
d8691d282b
@ -268,11 +268,15 @@ namespace cryfs {
|
||||
std::cout << "\nMounting filesystem. To unmount, call:\n$ fusermount -u " << options.mountDir() << "\n"
|
||||
<< std::endl;
|
||||
#endif
|
||||
fuse->run(options.mountDir(), options.fuseOptions());
|
||||
if (options.foreground()) {
|
||||
fuse->runInForeground(options.mountDir(), options.fuseOptions());
|
||||
} else {
|
||||
fuse->runInBackground(options.mountDir(), options.fuseOptions());
|
||||
}
|
||||
|
||||
if (stoppedBecauseOfIntegrityViolation) {
|
||||
if (stoppedBecauseOfIntegrityViolation) {
|
||||
throw CryfsException("Integrity violation detected. Unmounting.", ErrorCode::IntegrityViolation);
|
||||
}
|
||||
}
|
||||
} catch (const CryfsException &e) {
|
||||
throw; // CryfsException is only thrown if setup goes wrong. Throw it through so that we get the correct process exit code.
|
||||
} catch (const std::exception &e) {
|
||||
|
@ -56,9 +56,6 @@ ProgramOptions Parser::parse(const vector<string> &supportedCiphers) const {
|
||||
configfile = bf::absolute(vm["config"].as<string>());
|
||||
}
|
||||
bool foreground = vm.count("foreground");
|
||||
if (foreground) {
|
||||
fuseOptions.push_back(const_cast<char*>("-f"));
|
||||
}
|
||||
bool allowFilesystemUpgrade = vm.count("allow-filesystem-upgrade");
|
||||
bool allowReplacedFilesystem = vm.count("allow-replaced-filesystem");
|
||||
optional<double> unmountAfterIdleMinutes = 0.0; // first setting to 0 and then to none is somehow needed to silence a GCC warning from -Wmaybe-uninitialized
|
||||
|
@ -243,7 +243,33 @@ void Fuse::_logUnknownException() {
|
||||
LOG(ERR, "Unknown exception thrown");
|
||||
}
|
||||
|
||||
void Fuse::run(const bf::path &mountdir, const vector<string> &fuseOptions) {
|
||||
void Fuse::runInForeground(const bf::path &mountdir, const vector<string> &fuseOptions) {
|
||||
vector<string> realFuseOptions = fuseOptions;
|
||||
if (std::find(realFuseOptions.begin(), realFuseOptions.end(), "-f") == realFuseOptions.end()) {
|
||||
realFuseOptions.push_back("-f");
|
||||
}
|
||||
_run(mountdir, realFuseOptions);
|
||||
}
|
||||
|
||||
void Fuse::runInBackground(const bf::path &mountdir, const vector<string> &fuseOptions) {
|
||||
vector<string> realFuseOptions = fuseOptions;
|
||||
_removeAndWarnIfExists(&realFuseOptions, "-f");
|
||||
_removeAndWarnIfExists(&realFuseOptions, "-d");
|
||||
_run(mountdir, realFuseOptions);
|
||||
}
|
||||
|
||||
void Fuse::_removeAndWarnIfExists(vector<string> *fuseOptions, const std::string &option) {
|
||||
auto found = std::find(fuseOptions->begin(), fuseOptions->end(), option);
|
||||
if (found != fuseOptions->end()) {
|
||||
LOG(WARN, "The fuse option {} only works when running in foreground. Removing fuse option.", option);
|
||||
do {
|
||||
fuseOptions->erase(found);
|
||||
found = std::find(fuseOptions->begin(), fuseOptions->end(), option);
|
||||
} while (found != fuseOptions->end());
|
||||
}
|
||||
}
|
||||
|
||||
void Fuse::_run(const bf::path &mountdir, const vector<string> &fuseOptions) {
|
||||
_mountdir = mountdir;
|
||||
|
||||
ASSERT(_argv.size() == 0, "Filesystem already started");
|
||||
|
@ -24,7 +24,8 @@ public:
|
||||
explicit Fuse(std::function<std::shared_ptr<Filesystem> (Fuse *fuse)> init, std::function<void()> onMounted, std::string fstype, boost::optional<std::string> fsname);
|
||||
~Fuse();
|
||||
|
||||
void run(const boost::filesystem::path &mountdir, const std::vector<std::string> &fuseOptions);
|
||||
void runInBackground(const boost::filesystem::path &mountdir, const std::vector<std::string> &fuseOptions);
|
||||
void runInForeground(const boost::filesystem::path &mountdir, const std::vector<std::string> &fuseOptions);
|
||||
bool running() const;
|
||||
void stop();
|
||||
|
||||
@ -63,6 +64,8 @@ private:
|
||||
static void _logException(const std::exception &e);
|
||||
static void _logUnknownException();
|
||||
static char *_create_c_string(const std::string &str);
|
||||
static void _removeAndWarnIfExists(std::vector<std::string> *fuseOptions, const std::string &option);
|
||||
void _run(const boost::filesystem::path &mountdir, const std::vector<std::string> &fuseOptions);
|
||||
static bool _has_option(const std::vector<char *> &vec, const std::string &key);
|
||||
static bool _has_entry_with_prefix(const std::string &prefix, const std::vector<char *> &vec);
|
||||
std::vector<char *> _build_argv(const boost::filesystem::path &mountdir, const std::vector<std::string> &fuseOptions);
|
||||
|
@ -59,7 +59,7 @@ FuseTest::TempTestFS::TempTestFS(shared_ptr<MockFilesystem> fsimpl)
|
||||
:_mountDir(),
|
||||
_fuse([fsimpl] (Fuse*) {return fsimpl;}, []{}, "fusetest", boost::none), _fuse_thread(&_fuse) {
|
||||
|
||||
_fuse_thread.start(_mountDir.path(), {"-f"});
|
||||
_fuse_thread.start(_mountDir.path(), {});
|
||||
}
|
||||
|
||||
FuseTest::TempTestFS::~TempTestFS() {
|
||||
|
@ -18,7 +18,7 @@ FuseThread::FuseThread(Fuse *fuse)
|
||||
|
||||
void FuseThread::start(const bf::path &mountDir, const vector<string> &fuseOptions) {
|
||||
_child = thread([this, mountDir, fuseOptions] () {
|
||||
_fuse->run(mountDir, fuseOptions);
|
||||
_fuse->runInForeground(mountDir, fuseOptions);
|
||||
});
|
||||
//Wait until it is running (busy waiting is simple and doesn't hurt much here)
|
||||
while(!_fuse->running()) {}
|
||||
|
Loading…
Reference in New Issue
Block a user