file_container.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package gdrivefs
  2. import (
  3. "os"
  4. "sync"
  5. "github.com/jacobsa/fuse/fuseops"
  6. )
  7. type FileContainer struct {
  8. fileEntries map[fuseops.InodeID]*FileEntry
  9. tree *FileEntry
  10. fs *GDriveFS
  11. uid uint32
  12. gid uint32
  13. inodeMU *sync.Mutex
  14. }
  15. func NewFileContainer(fs *GDriveFS) *FileContainer {
  16. fc := &FileContainer{
  17. fileEntries: map[fuseops.InodeID]*FileEntry{},
  18. fs: fs,
  19. inodeMU: &sync.Mutex{},
  20. }
  21. rootEntry := fc.FileEntry(fuseops.RootInodeID)
  22. rootEntry.Attr = fuseops.InodeAttributes{
  23. Mode: os.FileMode(0755) | os.ModeDir,
  24. Uid: fs.config.UID,
  25. Gid: fs.config.GID,
  26. }
  27. rootEntry.isDir = true
  28. fc.tree = rootEntry
  29. return fc
  30. }
  31. func (fc *FileContainer) FindByInode(inode fuseops.InodeID) *FileEntry {
  32. return fc.fileEntries[inode]
  33. }
  34. func (fc *FileContainer) FindByGID(gid string) *FileEntry {
  35. for _, v := range fc.fileEntries {
  36. if v.GFile != nil && v.GFile.Id == gid {
  37. return v
  38. }
  39. }
  40. return nil
  41. }
  42. //Return or create inode
  43. func (fc *FileContainer) FileEntry(inodeOps ...fuseops.InodeID) *FileEntry {
  44. fc.inodeMU.Lock()
  45. defer fc.inodeMU.Unlock()
  46. var inode fuseops.InodeID
  47. if len(inodeOps) > 0 {
  48. inode = inodeOps[0]
  49. if fe, ok := fc.fileEntries[inode]; ok {
  50. return fe
  51. }
  52. } else { // generate new inode
  53. // Max Inode Number
  54. for inode = 2; inode < 99999; inode++ {
  55. _, ok := fc.fileEntries[inode]
  56. if !ok {
  57. break
  58. }
  59. }
  60. }
  61. fe := &FileEntry{
  62. Inode: inode,
  63. container: fc,
  64. //fs: fc.fs,
  65. children: []*FileEntry{},
  66. Attr: fuseops.InodeAttributes{},
  67. }
  68. fc.fileEntries[inode] = fe
  69. return fe
  70. }
  71. // RemoveEntry remove file entry
  72. func (fc *FileContainer) RemoveEntry(entry *FileEntry) {
  73. var inode fuseops.InodeID
  74. for k, e := range fc.fileEntries {
  75. if e == entry {
  76. inode = k
  77. }
  78. }
  79. delete(fc.fileEntries, inode)
  80. }