diff options
| author | Jakob Unterwurzacher | 2016-07-03 20:05:32 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2016-07-03 20:05:32 +0200 | 
| commit | 79851bf6cc391f1150be387631159d553d5426f3 (patch) | |
| tree | 560f3228054ad8a5a37500de5aa21832c021a03e /internal/fusefrontend | |
| parent | 9b725c15cf50cfb85ec6ec88c47843092775dedc (diff) | |
syscallcompat: OSX: add Renamat wrapper
Adds a poor man's renameat implementation for OSX.
Diffstat (limited to 'internal/fusefrontend')
| -rw-r--r-- | internal/fusefrontend/fs.go | 9 | ||||
| -rw-r--r-- | internal/fusefrontend/fs_dir.go | 5 | 
2 files changed, 10 insertions, 4 deletions
| diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index 58881d1..cd9eec1 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -4,6 +4,7 @@ package fusefrontend  import (  	"encoding/base64" +	"fmt"  	"os"  	"path/filepath"  	"sync" @@ -17,6 +18,7 @@ import (  	"github.com/rfjakob/gocryptfs/internal/contentenc"  	"github.com/rfjakob/gocryptfs/internal/cryptocore"  	"github.com/rfjakob/gocryptfs/internal/nametransform" +	"github.com/rfjakob/gocryptfs/internal/syscallcompat"  	"github.com/rfjakob/gocryptfs/internal/tlog"  ) @@ -385,6 +387,7 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod  		}  		defer oldDirFd.Close()  		finalOldDirFd = int(oldDirFd.Fd()) +		// Use relative path  		finalOldPath = cOldName  	}  	// Handle long destination file name @@ -399,6 +402,7 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod  		}  		defer newDirFd.Close()  		finalNewDirFd = int(newDirFd.Fd()) +		// Use relative path  		finalNewPath = cNewName  		// Create destination .name file  		err = fs.nameTransform.WriteLongName(newDirFd, cNewName, newPath) @@ -407,7 +411,8 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod  		}  	}  	// Actual rename -	err = syscall.Renameat(finalOldDirFd, finalOldPath, finalNewDirFd, finalNewPath) +	fmt.Printf("Renameat oldfd=%d oldpath=%s newfd=%d newpath=%s\n", finalOldDirFd, finalOldPath, finalNewDirFd, finalNewPath) +	err = syscallcompat.Renameat(finalOldDirFd, finalOldPath, finalNewDirFd, finalNewPath)  	if err == syscall.ENOTEMPTY || err == syscall.EEXIST {  		// If an empty directory is overwritten we will always get an error as  		// the "empty" directory will still contain gocryptfs.diriv. @@ -416,7 +421,7 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod  		// again.  		tlog.Debug.Printf("Rename: Handling ENOTEMPTY")  		if fs.Rmdir(newPath, context) == fuse.OK { -			err = syscall.Renameat(finalOldDirFd, finalOldPath, finalNewDirFd, finalNewPath) +			err = syscallcompat.Renameat(finalOldDirFd, finalOldPath, finalNewDirFd, finalNewPath)  		}  	}  	if err != nil { diff --git a/internal/fusefrontend/fs_dir.go b/internal/fusefrontend/fs_dir.go index 4657b95..699ec7b 100644 --- a/internal/fusefrontend/fs_dir.go +++ b/internal/fusefrontend/fs_dir.go @@ -14,6 +14,7 @@ import (  	"github.com/rfjakob/gocryptfs/internal/configfile"  	"github.com/rfjakob/gocryptfs/internal/cryptocore"  	"github.com/rfjakob/gocryptfs/internal/nametransform" +	"github.com/rfjakob/gocryptfs/internal/syscallcompat"  	"github.com/rfjakob/gocryptfs/internal/tlog"  ) @@ -168,7 +169,7 @@ func (fs *FS) Rmdir(path string, context *fuse.Context) (code fuse.Status) {  		// Protect against concurrent readers.  		fs.dirIVLock.Lock()  		defer fs.dirIVLock.Unlock() -		err = syscall.Renameat(int(dirfd.Fd()), nametransform.DirIVFilename, +		err = syscallcompat.Renameat(int(dirfd.Fd()), nametransform.DirIVFilename,  			int(parentDirFd.Fd()), tmpName)  		if err != nil {  			tlog.Warn.Printf("Rmdir: Renaming %s to %s failed: %v", @@ -182,7 +183,7 @@ func (fs *FS) Rmdir(path string, context *fuse.Context) (code fuse.Status) {  		if err != nil {  			// This can happen if another file in the directory was created in the  			// meantime, undo the rename -			err2 := syscall.Renameat(int(parentDirFd.Fd()), tmpName, +			err2 := syscallcompat.Renameat(int(parentDirFd.Fd()), tmpName,  				int(dirfd.Fd()), nametransform.DirIVFilename)  			if err != nil {  				tlog.Warn.Printf("Rmdir: Rename rollback failed: %v", err2) | 
