Skip to content

Commit

Permalink
Unmount improvements (#507)
Browse files Browse the repository at this point in the history
Log OSX unmount system error
Better handle Cygwin unmount child
Use WinFsp expected INT signal
  • Loading branch information
Ben RUBSON committed Apr 10, 2018
1 parent 0fb264d commit df7403c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 12 deletions.
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

0 comments on commit df7403c

Please sign in to comment.