Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unmount improvements #507

Merged
merged 1 commit into from
Apr 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 19 additions & 8 deletions encfs/FileUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1733,19 +1733,30 @@ RootPtr initFS(EncFS_Context *ctx, const std::shared_ptr<EncFS_Opts> &opts) {
}

void unmountFS(const char *mountPoint) {
// fuse_unmount succeeds and returns void
// fuse_unmount returns void, is assumed to succeed
fuse_unmount(mountPoint, nullptr);
#ifdef __APPLE__
// fuse_unmount does not work on Mac OS, see #428
unmount(mountPoint, MNT_FORCE);
// However it makes encfs to hang, so we must unmount
if (unmount(mountPoint, MNT_FORCE) != 0) {
int eno = errno;
if (eno != EINVAL) { //[EINVAL] The requested directory is not in the mount table.
RLOG(ERROR) << "Filesystem unmount failed: " << strerror(eno);
}
}
#endif
#ifdef __CYGWIN__
if(fork() == 0)
{
execl("/usr/bin/pkill", "/usr/bin/pkill", "-f", string("(^|/)encfs .*/.* ").append(mountPoint).append("?( |$)").c_str(), (char *)0);
}
pid_t pid;
int status;
wait(&status);
if ((pid = fork()) == 0) {
execl("/usr/bin/pkill", "/usr/bin/pkill", "-INT", "-f", string("(^|/)encfs .*/.* ").append(mountPoint).append("?( |$)").c_str(), (char *)0);
int eno = errno;
RLOG(ERROR) << "Filesystem unmount failed: " << strerror(eno);
_Exit(127);
}
if (pid > 0) {
waitpid(pid, &status, 0);
}
#endif
}

Expand All @@ -1770,8 +1781,8 @@ bool unmountFS(EncFS_Context *ctx) {
return false;
}
// Time to unmount!
RLOG(INFO) << "Filesystem inactive, unmounting: " << ctx->opts->mountPoint;
unmountFS(ctx->opts->mountPoint.c_str());
RLOG(INFO) << "Filesystem inactive, unmounted: " << ctx->opts->mountPoint;
return true;
}

Expand Down
11 changes: 7 additions & 4 deletions encfs/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ static bool processArgs(int argc, char *argv[],
out->opts->config.assign(optarg);
break;
case 'u':
//we want to log to console, not to syslog, in case of error
out->isDaemon = false;
out->opts->unmount = true;
break;
case 'f':
Expand Down Expand Up @@ -656,16 +658,17 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}

encfs::initLogging(encfsArgs->isVerbose, encfsArgs->isDaemon);
ELPP_INITIALIZE_SYSLOG(encfsArgs->syslogTag.c_str(), LOG_PID, LOG_USER);

// Let's unmount if requested
if (encfsArgs->opts->unmount) {
unmountFS(encfsArgs->opts->mountPoint.c_str());
// We use cout here to avoid logging to stderr (and to mess-up tests output)
cout << "Filesystem unmounting: " << encfsArgs->opts->mountPoint << endl;
unmountFS(encfsArgs->opts->mountPoint.c_str());
return 0;
}

encfs::initLogging(encfsArgs->isVerbose, encfsArgs->isDaemon);
ELPP_INITIALIZE_SYSLOG(encfsArgs->syslogTag.c_str(), LOG_PID, LOG_USER);

VLOG(1) << "Root directory: " << encfsArgs->opts->rootDir;
VLOG(1) << "Fuse arguments: " << encfsArgs->toString();

Expand Down