You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

fuse.go 2.0 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //go:build linux || (darwin && amd64)
  2. package fuse
  3. import (
  4. "os"
  5. "syscall"
  6. fusefs "github.com/hanwen/go-fuse/v2/fs"
  7. "github.com/hanwen/go-fuse/v2/fuse"
  8. "gitlink.org.cn/cloudream/storage/client2/internal/mount/config"
  9. )
  10. type Fuse struct {
  11. config *config.Config
  12. fs Fs
  13. }
  14. func NewFuse(config *config.Config, fs Fs) *Fuse {
  15. return &Fuse{
  16. config: config,
  17. fs: fs,
  18. }
  19. }
  20. func (v *Fuse) Root() fusefs.InodeEmbedder {
  21. return newDirNode(v, v.fs.Root())
  22. }
  23. func translateError(err error) syscall.Errno {
  24. switch err {
  25. case nil:
  26. return 0
  27. case ErrNotExists, os.ErrNotExist:
  28. return syscall.ENOENT
  29. case ErrExists, os.ErrExist:
  30. return syscall.EEXIST
  31. case ErrPermission, os.ErrPermission:
  32. return syscall.EACCES
  33. case ErrNotEmpty:
  34. return syscall.ENOTEMPTY
  35. default:
  36. return syscall.EIO
  37. }
  38. }
  39. // get the Mode from a fs Node
  40. func (v *Fuse) getMode(node FsEntry) uint32 {
  41. Mode := node.Mode().Perm()
  42. if node.IsDir() {
  43. Mode |= fuse.S_IFDIR
  44. } else {
  45. Mode |= fuse.S_IFREG
  46. }
  47. return uint32(Mode)
  48. }
  49. // fill in attr from node
  50. func (v *Fuse) fillAttr(node FsEntry, attr *fuse.Attr) {
  51. Size := uint64(node.Size())
  52. const BlockSize = 512
  53. Blocks := (Size + BlockSize - 1) / BlockSize
  54. attr.Owner.Gid = v.config.GID
  55. attr.Owner.Uid = v.config.UID
  56. attr.Mode = v.getMode(node)
  57. attr.Size = Size
  58. attr.Nlink = 1
  59. attr.Blocks = Blocks
  60. // attr.Blksize = BlockSize // not supported in freebsd/darwin, defaults to 4k if not set
  61. modTime := node.ModTime()
  62. attr.Atime = uint64(modTime.Unix())
  63. attr.Atimensec = uint32(modTime.Nanosecond())
  64. attr.Mtime = uint64(modTime.Unix())
  65. attr.Mtimensec = uint32(modTime.Nanosecond())
  66. attr.Ctime = uint64(modTime.Unix())
  67. attr.Ctimensec = uint32(modTime.Nanosecond())
  68. }
  69. func (v *Fuse) fillAttrOut(node FsEntry, out *fuse.AttrOut) {
  70. v.fillAttr(node, &out.Attr)
  71. out.SetTimeout(v.config.AttrTimeout)
  72. }
  73. func (v *Fuse) fillEntryOut(node FsEntry, out *fuse.EntryOut) {
  74. v.fillAttr(node, &out.Attr)
  75. out.SetAttrTimeout(v.config.AttrTimeout)
  76. out.SetEntryTimeout(v.config.AttrTimeout)
  77. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。