|
|
@ -20,6 +20,10 @@ const ( |
|
|
|
// with the required buffer size.
|
|
|
|
func (wfs *WFS) GetXAttr(cancel <-chan struct{}, header *fuse.InHeader, attr string, dest []byte) (size uint32, code fuse.Status) { |
|
|
|
|
|
|
|
if wfs.option.DisableXAttr { |
|
|
|
return 0, fuse.Status(syscall.ENOTSUP) |
|
|
|
} |
|
|
|
|
|
|
|
//validate attr name
|
|
|
|
if len(attr) > MAX_XATTR_NAME_SIZE { |
|
|
|
if runtime.GOOS == "darwin" { |
|
|
@ -70,6 +74,10 @@ func (wfs *WFS) GetXAttr(cancel <-chan struct{}, header *fuse.InHeader, attr str |
|
|
|
// attribute does not already exist.
|
|
|
|
func (wfs *WFS) SetXAttr(cancel <-chan struct{}, input *fuse.SetXAttrIn, attr string, data []byte) fuse.Status { |
|
|
|
|
|
|
|
if wfs.option.DisableXAttr { |
|
|
|
return fuse.Status(syscall.ENOTSUP) |
|
|
|
} |
|
|
|
|
|
|
|
if wfs.IsOverQuota { |
|
|
|
return fuse.Status(syscall.ENOSPC) |
|
|
|
} |
|
|
@ -127,6 +135,11 @@ func (wfs *WFS) SetXAttr(cancel <-chan struct{}, input *fuse.SetXAttrIn, attr st |
|
|
|
// slice, and return the number of bytes. If the buffer is too
|
|
|
|
// small, return ERANGE, with the required buffer size.
|
|
|
|
func (wfs *WFS) ListXAttr(cancel <-chan struct{}, header *fuse.InHeader, dest []byte) (n uint32, code fuse.Status) { |
|
|
|
|
|
|
|
if wfs.option.DisableXAttr { |
|
|
|
return 0, fuse.Status(syscall.ENOTSUP) |
|
|
|
} |
|
|
|
|
|
|
|
_, _, entry, status := wfs.maybeReadEntry(header.NodeId) |
|
|
|
if status != fuse.OK { |
|
|
|
return 0, status |
|
|
@ -156,6 +169,11 @@ func (wfs *WFS) ListXAttr(cancel <-chan struct{}, header *fuse.InHeader, dest [] |
|
|
|
|
|
|
|
// RemoveXAttr removes an extended attribute.
|
|
|
|
func (wfs *WFS) RemoveXAttr(cancel <-chan struct{}, header *fuse.InHeader, attr string) fuse.Status { |
|
|
|
|
|
|
|
if wfs.option.DisableXAttr { |
|
|
|
return fuse.Status(syscall.ENOTSUP) |
|
|
|
} |
|
|
|
|
|
|
|
if len(attr) == 0 { |
|
|
|
return fuse.EINVAL |
|
|
|
} |
|
|
|