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.
This commit is contained in:
Bolshevik 2018-05-01 18:46:51 +02:00 committed by Jakob Unterwurzacher
parent 95964fb5f0
commit 5ccc06d5cb
4 changed files with 22 additions and 13 deletions

View File

@ -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.

View File

@ -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
}

View File

@ -13,3 +13,7 @@ const xattrUserPrefix = "user."
func disallowedXAttrName(attr string) bool {
return !strings.HasPrefix(attr, xattrUserPrefix)
}
func filterXattrSetFlags(flags int) int {
return flags
}

View File

@ -1,8 +0,0 @@
// +build !linux
// Package fusefrontend interfaces directly with the go-fuse library.
package fusefrontend
func disallowedXAttrName(attr string) bool {
return false
}