From 3f4b5b8d482e47d73fdafb4b90a4a727dde6626a Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Tue, 21 Jul 2015 21:25:05 +0200 Subject: [PATCH] fuse/mount: display symlinks properly --- cmd/restic/fuse/dir.go | 4 ++++ cmd/restic/fuse/link.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 cmd/restic/fuse/link.go diff --git a/cmd/restic/fuse/dir.go b/cmd/restic/fuse/dir.go index 43ea71e2b..ef7013977 100644 --- a/cmd/restic/fuse/dir.go +++ b/cmd/restic/fuse/dir.go @@ -71,6 +71,8 @@ func (d *dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { typ = fuse.DT_Dir case "file": typ = fuse.DT_File + case "symlink": + typ = fuse.DT_Link } ret = append(ret, fuse.Dirent{ @@ -93,6 +95,8 @@ func (d *dir) Lookup(ctx context.Context, name string) (fs.Node, error) { return newDir(d.repo, child) case "file": return newFile(d.repo, child) + case "symlink": + return newLink(d.repo, child) default: return nil, fuse.ENOENT } diff --git a/cmd/restic/fuse/link.go b/cmd/restic/fuse/link.go new file mode 100644 index 000000000..c5a17811b --- /dev/null +++ b/cmd/restic/fuse/link.go @@ -0,0 +1,30 @@ +package fuse + +import ( + "bazil.org/fuse" + "bazil.org/fuse/fs" + "github.com/restic/restic" + "github.com/restic/restic/repository" + "golang.org/x/net/context" +) + +// Statically ensure that *file implements the given interface +var _ = fs.NodeReadlinker(&link{}) + +type link struct { + node *restic.Node +} + +func newLink(repo *repository.Repository, node *restic.Node) (*link, error) { + return &link{node: node}, nil +} + +func (l *link) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) { + return l.node.LinkTarget, nil +} + +func (l *link) Attr(ctx context.Context, a *fuse.Attr) error { + a.Inode = l.node.Inode + a.Mode = l.node.Mode + return nil +}