diff options
| author | Bolshevik | 2018-05-01 18:46:51 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2018-05-07 21:45:40 +0200 | 
| commit | 5ccc06d5cb321b1400e33a7d0819bf617c52600d (patch) | |
| tree | d9399abae93ddff2f9d549b7cd8290a75f42e7a0 | |
| parent | 95964fb5f0646ffb21d7b67ac9077ba2ef880526 (diff) | |
xattr: added passing of a "flags" parameter
Pass the "flags" parameter to the lower layer syscall.
This makes Apple applications being able to successfully save data.
| -rw-r--r-- | internal/fusefrontend/xattr.go | 8 | ||||
| -rw-r--r-- | internal/fusefrontend/xattr_darwin.go | 15 | ||||
| -rw-r--r-- | internal/fusefrontend/xattr_linux.go | 4 | ||||
| -rw-r--r-- | internal/fusefrontend/xattr_notlinux.go | 8 | 
4 files changed, 22 insertions, 13 deletions
| diff --git a/internal/fusefrontend/xattr.go b/internal/fusefrontend/xattr.go index 36ab4d5..9833368 100644 --- a/internal/fusefrontend/xattr.go +++ b/internal/fusefrontend/xattr.go @@ -54,14 +54,12 @@ func (fs *FS) SetXAttr(path string, attr string, data []byte, flags int, context  	if fs.isFiltered(path) {  		return fuse.EPERM  	} -	if flags != 0 { -		// Drop this once https://github.com/pkg/xattr/pull/26 is merged -		return fuse.ENOSYS -	}  	if disallowedXAttrName(attr) {  		return fuse.EPERM  	} +	flags = filterXattrSetFlags(flags) +  	cPath, err := fs.getBackingPath(path)  	if err != nil {  		return fuse.ToStatus(err) @@ -69,7 +67,7 @@ func (fs *FS) SetXAttr(path string, attr string, data []byte, flags int, context  	cAttr := fs.encryptXattrName(attr)  	// xattr data is encrypted like a symlink target  	cData64 := []byte(fs.encryptSymlinkTarget(string(data))) -	return unpackXattrErr(xattr.Set(cPath, cAttr, cData64)) +	return unpackXattrErr(xattr.SetWithFlags(cPath, cAttr, cData64, flags))  }  // RemoveXAttr implements pathfs.Filesystem. diff --git a/internal/fusefrontend/xattr_darwin.go b/internal/fusefrontend/xattr_darwin.go new file mode 100644 index 0000000..b626006 --- /dev/null +++ b/internal/fusefrontend/xattr_darwin.go @@ -0,0 +1,15 @@ +// +build darwin + +// Package fusefrontend interfaces directly with the go-fuse library. +package fusefrontend + +import "github.com/pkg/xattr" + +func disallowedXAttrName(attr string) bool { +	return false +} + +// On Darwin it is needed to unset XATTR_NOSECURITY 0x0008 +func filterXattrSetFlags(flags int) int { +	return flags &^ xattr.XATTR_NOSECURITY +} diff --git a/internal/fusefrontend/xattr_linux.go b/internal/fusefrontend/xattr_linux.go index ebe42b1..61b90e3 100644 --- a/internal/fusefrontend/xattr_linux.go +++ b/internal/fusefrontend/xattr_linux.go @@ -13,3 +13,7 @@ const xattrUserPrefix = "user."  func disallowedXAttrName(attr string) bool {  	return !strings.HasPrefix(attr, xattrUserPrefix)  } + +func filterXattrSetFlags(flags int) int { +	return flags +} diff --git a/internal/fusefrontend/xattr_notlinux.go b/internal/fusefrontend/xattr_notlinux.go deleted file mode 100644 index aa9c981..0000000 --- a/internal/fusefrontend/xattr_notlinux.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !linux - -// Package fusefrontend interfaces directly with the go-fuse library. -package fusefrontend - -func disallowedXAttrName(attr string) bool { -	return false -} | 
