From 7092af6329d2f54292a86e343234f845ddcf6b72 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 3 Dec 2017 17:25:00 +0100 Subject: [PATCH] fuse: Handle sockets/fifos/devs correctly Closes #1463 --- internal/fuse/dir.go | 2 ++ internal/fuse/other.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 internal/fuse/other.go diff --git a/internal/fuse/dir.go b/internal/fuse/dir.go index f26f439c9..f0c829f1c 100644 --- a/internal/fuse/dir.go +++ b/internal/fuse/dir.go @@ -185,6 +185,8 @@ func (d *dir) Lookup(ctx context.Context, name string) (fs.Node, error) { return newFile(ctx, d.root, fs.GenerateDynamicInode(d.inode, name), node) case "symlink": return newLink(ctx, d.root, fs.GenerateDynamicInode(d.inode, name), node) + case "dev", "chardev", "fifo", "socket": + return newOther(ctx, d.root, fs.GenerateDynamicInode(d.inode, name), node) default: debug.Log(" node %v has unknown type %v", name, node.Type) return nil, fuse.ENOENT diff --git a/internal/fuse/other.go b/internal/fuse/other.go new file mode 100644 index 000000000..899e341ce --- /dev/null +++ b/internal/fuse/other.go @@ -0,0 +1,41 @@ +// +build !openbsd +// +build !windows + +package fuse + +import ( + "bazil.org/fuse" + "github.com/restic/restic/internal/restic" + "golang.org/x/net/context" +) + +type other struct { + root *Root + node *restic.Node + inode uint64 +} + +func newOther(ctx context.Context, root *Root, inode uint64, node *restic.Node) (*other, error) { + return &other{root: root, inode: inode, node: node}, nil +} + +func (l *other) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) { + return l.node.LinkTarget, nil +} + +func (l *other) Attr(ctx context.Context, a *fuse.Attr) error { + a.Inode = l.inode + a.Mode = l.node.Mode + + if !l.root.cfg.OwnerIsRoot { + a.Uid = l.node.UID + a.Gid = l.node.GID + } + a.Atime = l.node.AccessTime + a.Ctime = l.node.ChangeTime + a.Mtime = l.node.ModTime + + a.Nlink = uint32(l.node.Links) + + return nil +}