From e2b912c731d99cb7cd92622d3309a1f6bd54c1b3 Mon Sep 17 00:00:00 2001 From: Valient Gough Date: Thu, 3 Oct 2013 05:10:23 +0000 Subject: [PATCH] add delaymount option which delays initial mount. Patch by Jeff King git-svn-id: http://encfs.googlecode.com/svn/trunk@115 db9cf616-1c43-0410-9cb8-a902689de0d6 --- encfs/encfs.pod | 7 ++++++- encfs/main.cpp | 18 ++++++++++++++++++ fs/FileUtils.cpp | 8 ++++++++ fs/FileUtils.h | 2 ++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/encfs/encfs.pod b/encfs/encfs.pod index b637633..d264b83 100644 --- a/encfs/encfs.pod +++ b/encfs/encfs.pod @@ -10,7 +10,7 @@ B [B<--version>] [B<-s>] [B<-f>] [B<-v>|B<--verbose>] [B<-i MINUTES>|B<--idle=MINUTES>] [B<--extpass=program>] [B<-S>|B<--stdinpass>] [B<--anykey>] [B<--forcedecode>] [B<-d>|B<--fuse-debug>] [B<--public>] [B<--no-default-flags>] -[B<--ondemand>] [B<--reverse>] [B<--standard>] +[B<--ondemand>] [B<--delaymount>] [B<--reverse>] [B<--standard>] [B<-o FUSE_OPTION>] I I [B<--> [I]] @@ -106,6 +106,11 @@ internally dropping its reference to it. If someone attempts to access the filesystem again, the extpass program is used to prompt the user for the password. If this succeeds, then the filesystem becomes available again. +=item B<--delaymount> + +Do not mount the filesystem when encfs starts; instead, delay mounting until +first use. This option only makes sense with B<--ondemand>. + =item B<--reverse> Normally B provides a plaintext view of data on demand. Normally it diff --git a/encfs/main.cpp b/encfs/main.cpp index 374adcb..bf0d05a 100644 --- a/encfs/main.cpp +++ b/encfs/main.cpp @@ -102,6 +102,7 @@ struct EncFS_Args if(opts->annotate) ss << "(annotate) "; if(opts->reverseEncryption) ss << "(reverseEncryption) "; if(opts->mountOnDemand) ss << "(mountOnDemand) "; + if(opts->delayMount) ss << "(delayMount) "; for(int i=0; i &out) {"anykey", 0, 0, 'k'}, // skip key checks {"no-default-flags", 0, 0, 'N'}, // don't use default fuse flags {"ondemand", 0, 0, 'm'}, // mount on-demand + {"delaymount", 0, 0, 'M'}, // delay initial mount until use {"public", 0, 0, 'P'}, // public mode {"extpass", 1, 0, 'p'}, // external password program // {"single-thread", 0, 0, 's'}, // single-threaded mode @@ -294,6 +296,9 @@ bool processArgs(int argc, char *argv[], const shared_ptr &out) case 'm': out->opts->mountOnDemand = true; break; + case 'M': + out->opts->delayMount = true; + break; case 'N': useDefaultFlags = false; break; @@ -404,6 +409,15 @@ bool processArgs(int argc, char *argv[], const shared_ptr &out) } } + if(out->opts->delayMount && !out->opts->mountOnDemand) + { + cerr << + // xgroup(usage) + _("You must use mount-on-demand with delay-mount") + << endl; + return false; + } + if(out->opts->mountOnDemand && out->opts->passwordProgram.empty()) { cerr << @@ -594,6 +608,10 @@ int main(int argc, char *argv[]) if( rootInfo ) { + // turn off delayMount, as our prior call to initFS has already + // respected any delay, and we want future calls to actually mount. + encfsArgs->opts->delayMount = false; + // set the globally visible root directory node ctx->setRoot( rootInfo->root ); ctx->args = encfsArgs; diff --git a/fs/FileUtils.cpp b/fs/FileUtils.cpp index c84de1f..40c4195 100644 --- a/fs/FileUtils.cpp +++ b/fs/FileUtils.cpp @@ -1609,6 +1609,14 @@ RootPtr initFS( EncFS_Context *ctx, const shared_ptr &opts ) return rootInfo; } + if(opts->delayMount) + { + rootInfo = RootPtr( new EncFS_Root ); + rootInfo->cipher = cipher; + rootInfo->root = shared_ptr(); + return rootInfo; + } + // get user key CipherKey userKey; diff --git a/fs/FileUtils.h b/fs/FileUtils.h index 4008c40..a821838 100644 --- a/fs/FileUtils.h +++ b/fs/FileUtils.h @@ -72,6 +72,7 @@ struct EncFS_Opts bool createIfNotFound; // create filesystem if not found bool idleTracking; // turn on idle monitoring of filesystem bool mountOnDemand; // mounting on-demand + bool delayMount; // delay initial mount bool checkKey; // check crypto key decoding bool forceDecode; // force decode on MAC block failures @@ -91,6 +92,7 @@ struct EncFS_Opts createIfNotFound = true; idleTracking = false; mountOnDemand = false; + delayMount = false; checkKey = true; forceDecode = false; useStdin = false;