diff options
author | Jakob Unterwurzacher | 2015-12-19 13:21:15 +0100 |
---|---|---|
committer | Jakob Unterwurzacher | 2015-12-19 13:21:15 +0100 |
commit | 88826dc51d7919ef8b190c079955230e653323e2 (patch) | |
tree | 73baf5d51575200afd4aaa331aff0a3b281b87a5 /pathfs_frontend/fs.go | |
parent | 00a712b4d1e68bb3c156eb8f97fbb89d684a7e92 (diff) |
diriv: handle directory rename over directory
If an empty directory is overwritten we will always get
ENOTEMPTY as the "empty" directory will still contain gocryptfs.diriv.
Handle that case by removing the target directory and trying again.
Fixes issue #10
Diffstat (limited to 'pathfs_frontend/fs.go')
-rw-r--r-- | pathfs_frontend/fs.go | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/pathfs_frontend/fs.go b/pathfs_frontend/fs.go index f853556..e930228 100644 --- a/pathfs_frontend/fs.go +++ b/pathfs_frontend/fs.go @@ -1,5 +1,7 @@ package pathfs_frontend +// FUSE operations on paths + import ( "encoding/base64" "os" @@ -300,6 +302,17 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod fs.CryptFS.DirIVCacheEnc.Clear() err = os.Rename(cOldPath, cNewPath) + + if lerr, ok := err.(*os.LinkError); ok && lerr.Err == syscall.ENOTEMPTY { + // If an empty directory is overwritten we will always get + // ENOTEMPTY as the "empty" directory will still contain gocryptfs.diriv. + // Handle that case by removing the target directory and trying again. + cryptfs.Debug.Printf("Rename: Handling ENOTEMPTY\n") + if fs.Rmdir(newPath, context) == fuse.OK { + err = os.Rename(cOldPath, cNewPath) + } + } + return fuse.ToStatus(err) } |