mirror of
https://github.com/restic/restic.git
synced 2025-03-16 00:00:05 +01:00
Extended attribute support for fuse
This commit is contained in:
parent
69d2340cf2
commit
e618068a7c
3 changed files with 49 additions and 4 deletions
|
@ -161,3 +161,21 @@ func (d *dir) Lookup(ctx context.Context, name string) (fs.Node, error) {
|
|||
return nil, fuse.ENOENT
|
||||
}
|
||||
}
|
||||
|
||||
func (d *dir) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
|
||||
debug.Log("Listxattr(%v, %v)", d.node.Name, req.Size)
|
||||
for _, attr := range d.node.ExtendedAttributes {
|
||||
resp.Append(attr.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *dir) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
|
||||
debug.Log("Getxattr(%v, %v, %v)", d.node.Name, req.Name, req.Size)
|
||||
attrval := d.node.GetExtendedAttribute(req.Name)
|
||||
if attrval != nil {
|
||||
resp.Xattr = attrval
|
||||
return nil
|
||||
}
|
||||
return fuse.ErrNoXattr
|
||||
}
|
||||
|
|
|
@ -161,3 +161,21 @@ func (f *file) Release(ctx context.Context, req *fuse.ReleaseRequest) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *file) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
|
||||
debug.Log("Listxattr(%v, %v)", f.node.Name, req.Size)
|
||||
for _, attr := range f.node.ExtendedAttributes {
|
||||
resp.Append(attr.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *file) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
|
||||
debug.Log("Getxattr(%v, %v, %v)", f.node.Name, req.Name, req.Size)
|
||||
attrval := f.node.GetExtendedAttribute(req.Name)
|
||||
if attrval != nil {
|
||||
resp.Xattr = attrval
|
||||
return nil
|
||||
}
|
||||
return fuse.ErrNoXattr
|
||||
}
|
||||
|
|
|
@ -103,6 +103,16 @@ func nodeTypeFromFileInfo(fi os.FileInfo) string {
|
|||
return ""
|
||||
}
|
||||
|
||||
// GetExtendedAttribute gets the extended attribute.
|
||||
func (node Node) GetExtendedAttribute(a string) []byte {
|
||||
for _, attr := range node.ExtendedAttributes {
|
||||
if attr.Name == a {
|
||||
return attr.Value
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CreateAt creates the node at the given path and restores all the meta data.
|
||||
func (node *Node) CreateAt(path string, repo Repository) error {
|
||||
debug.Log("create node %v at %v", node.Name, path)
|
||||
|
@ -557,6 +567,9 @@ func (node *Node) fillExtra(path string, fi os.FileInfo) error {
|
|||
case "symlink":
|
||||
node.LinkTarget, err = fs.Readlink(path)
|
||||
err = errors.Wrap(err, "Readlink")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case "dev":
|
||||
node.Device = uint64(stat.rdev())
|
||||
case "chardev":
|
||||
|
@ -566,10 +579,6 @@ func (node *Node) fillExtra(path string, fi os.FileInfo) error {
|
|||
default:
|
||||
return errors.Errorf("invalid node type %q", node.Type)
|
||||
}
|
||||
|
||||
if err {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = node.fillExtendedAttributes(path); err != nil {
|
||||
return err
|
||||
|
|
Loading…
Add table
Reference in a new issue