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:
parent
95964fb5f0
commit
5ccc06d5cb
|
@ -54,14 +54,12 @@ func (fs *FS) SetXAttr(path string, attr string, data []byte, flags int, context
|
||||||
if fs.isFiltered(path) {
|
if fs.isFiltered(path) {
|
||||||
return fuse.EPERM
|
return fuse.EPERM
|
||||||
}
|
}
|
||||||
if flags != 0 {
|
|
||||||
// Drop this once https://github.com/pkg/xattr/pull/26 is merged
|
|
||||||
return fuse.ENOSYS
|
|
||||||
}
|
|
||||||
if disallowedXAttrName(attr) {
|
if disallowedXAttrName(attr) {
|
||||||
return fuse.EPERM
|
return fuse.EPERM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flags = filterXattrSetFlags(flags)
|
||||||
|
|
||||||
cPath, err := fs.getBackingPath(path)
|
cPath, err := fs.getBackingPath(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fuse.ToStatus(err)
|
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)
|
cAttr := fs.encryptXattrName(attr)
|
||||||
// xattr data is encrypted like a symlink target
|
// xattr data is encrypted like a symlink target
|
||||||
cData64 := []byte(fs.encryptSymlinkTarget(string(data)))
|
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.
|
// RemoveXAttr implements pathfs.Filesystem.
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -13,3 +13,7 @@ const xattrUserPrefix = "user."
|
||||||
func disallowedXAttrName(attr string) bool {
|
func disallowedXAttrName(attr string) bool {
|
||||||
return !strings.HasPrefix(attr, xattrUserPrefix)
|
return !strings.HasPrefix(attr, xattrUserPrefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func filterXattrSetFlags(flags int) int {
|
||||||
|
return flags
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// +build !linux
|
|
||||||
|
|
||||||
// Package fusefrontend interfaces directly with the go-fuse library.
|
|
||||||
package fusefrontend
|
|
||||||
|
|
||||||
func disallowedXAttrName(attr string) bool {
|
|
||||||
return false
|
|
||||||
}
|
|
Loading…
Reference in New Issue