mirror of
https://github.com/rclone/rclone.git
synced 2025-01-03 04:49:47 +01:00
mount2: introduce symlink support #2975
This commit is contained in:
parent
db1ed69693
commit
d629102fa6
@ -51,9 +51,14 @@ func (f *FS) SetDebug(debug bool) {
|
|||||||
|
|
||||||
// get the Mode from a vfs Node
|
// get the Mode from a vfs Node
|
||||||
func getMode(node os.FileInfo) uint32 {
|
func getMode(node os.FileInfo) uint32 {
|
||||||
Mode := node.Mode().Perm()
|
vfsMode := node.Mode()
|
||||||
if node.IsDir() {
|
Mode := vfsMode.Perm()
|
||||||
|
if vfsMode&os.ModeDir != 0 {
|
||||||
Mode |= fuse.S_IFDIR
|
Mode |= fuse.S_IFDIR
|
||||||
|
} else if vfsMode&os.ModeSymlink != 0 {
|
||||||
|
Mode |= fuse.S_IFLNK
|
||||||
|
} else if vfsMode&os.ModeNamedPipe != 0 {
|
||||||
|
Mode |= fuse.S_IFIFO
|
||||||
} else {
|
} else {
|
||||||
Mode |= fuse.S_IFREG
|
Mode |= fuse.S_IFREG
|
||||||
}
|
}
|
||||||
|
@ -458,3 +458,31 @@ func (n *Node) Listxattr(ctx context.Context, dest []byte) (uint32, syscall.Errn
|
|||||||
}
|
}
|
||||||
|
|
||||||
var _ fusefs.NodeListxattrer = (*Node)(nil)
|
var _ fusefs.NodeListxattrer = (*Node)(nil)
|
||||||
|
|
||||||
|
var _ fusefs.NodeReadlinker = (*Node)(nil)
|
||||||
|
|
||||||
|
// Readlink read symbolic link target.
|
||||||
|
func (n *Node) Readlink(ctx context.Context) (ret []byte, err syscall.Errno) {
|
||||||
|
defer log.Trace(n, "")("ret=%v, err=%v", &ret, &err)
|
||||||
|
path := n.node.Path()
|
||||||
|
s, serr := n.node.VFS().Readlink(path)
|
||||||
|
return []byte(s), translateError(serr)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ fusefs.NodeSymlinker = (*Node)(nil)
|
||||||
|
|
||||||
|
// Symlink create symbolic link.
|
||||||
|
func (n *Node) Symlink(ctx context.Context, target, name string, out *fuse.EntryOut) (node *fusefs.Inode, err syscall.Errno) {
|
||||||
|
defer log.Trace(n, "name=%v, target=%v", name, target)("node=%v, err=%v", &node, &err)
|
||||||
|
fullPath := path.Join(n.node.Path(), name)
|
||||||
|
vfsNode, serr := n.node.VFS().CreateSymlink(target, fullPath)
|
||||||
|
if serr != nil {
|
||||||
|
return nil, translateError(serr)
|
||||||
|
}
|
||||||
|
|
||||||
|
n.fsys.setEntryOut(vfsNode, out)
|
||||||
|
newNode := newNode(n.fsys, vfsNode)
|
||||||
|
newInode := n.NewInode(ctx, newNode, fusefs.StableAttr{Mode: out.Attr.Mode})
|
||||||
|
|
||||||
|
return newInode, 0
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user