134 lines
3.0 KiB
Go
134 lines
3.0 KiB
Go
package ffs
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"fusetest/furcadia"
|
|
"os"
|
|
"syscall"
|
|
"time"
|
|
|
|
"bazil.org/fuse"
|
|
"bazil.org/fuse/fs"
|
|
)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// CONSTANTS //////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
const (
|
|
FURRES_DIR_INODE_BASE = 0x1000
|
|
FURRES_DIR_MAX_INODES = 0x1000
|
|
)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// TYPE: DreamsDir ////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
type FurresDir struct {
|
|
_attr fuse.Attr
|
|
_entries []fuse.Dirent
|
|
_index map[string]int
|
|
}
|
|
|
|
func NewFurresDir(inodeBase uint64, rootUID, rootGID uint32) *FurresDir {
|
|
now := time.Now()
|
|
dir := &FurresDir{
|
|
_attr: fuse.Attr{
|
|
Inode: inodeBase,
|
|
Nlink: 1,
|
|
Mode: os.ModeDir | 0500,
|
|
Uid: rootUID,
|
|
Gid: rootGID,
|
|
Atime: now,
|
|
Ctime: now,
|
|
Mtime: now,
|
|
},
|
|
_index: make(map[string]int),
|
|
}
|
|
|
|
// add basic entries
|
|
dir._entries = append(
|
|
dir._entries,
|
|
fuse.Dirent{Inode: dir._attr.Inode, Name: ".", Type: fuse.DT_Dir},
|
|
fuse.Dirent{Inode: ROOT_INODE, Name: "..", Type: fuse.DT_Dir},
|
|
)
|
|
|
|
// add basic entries to the index
|
|
for i := range dir._entries {
|
|
dirent := &dir._entries[i]
|
|
dir._index[dirent.Name] = i
|
|
}
|
|
|
|
return dir
|
|
}
|
|
|
|
func (d *FurresDir) GetAttr() *fuse.Attr {
|
|
return &d._attr
|
|
}
|
|
|
|
func (d *FurresDir) Attr(ctx context.Context, a *fuse.Attr) error {
|
|
*a = d._attr
|
|
return nil
|
|
}
|
|
|
|
func (d *FurresDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
|
|
return d._entries, nil
|
|
// pounce := G_FS._pounce
|
|
// furres := pounce.Furres
|
|
// items := make([]fuse.Dirent, len(furres)+2)
|
|
|
|
// items[0] = fuse.Dirent{Inode: d._attr.Inode, Name: ".", Type: fuse.DT_Dir}
|
|
// items[1] = fuse.Dirent{Inode: ROOT_INODE, Name: "..", Type: fuse.DT_Dir}
|
|
|
|
// var i uint64 = 2
|
|
// for _, furre := range furres {
|
|
// items[i] = fuse.Dirent{
|
|
// Inode: d._attr.Inode + i - 1,
|
|
// Name: furre.DisplayName,
|
|
// Type: fuse.DT_File,
|
|
// }
|
|
// i++
|
|
// }
|
|
|
|
// return items, nil
|
|
}
|
|
|
|
func (d *FurresDir) Lookup(ctx context.Context, name string) (fs.Node, error) {
|
|
if name == "." {
|
|
return d, nil
|
|
}
|
|
|
|
// find dirent for the given name
|
|
|
|
direntIndex, exists = d._index[name]
|
|
if !exists {
|
|
return nil, syscall.ENOENT
|
|
}
|
|
|
|
furres := G_FS._pounce.Furres
|
|
shortname := furcadia.GetShortName(name)
|
|
furre, exists := furres[shortname]
|
|
if !exists {
|
|
fmt.Printf("[F] FurresDir().Lookup('%v' -> %v): ENOENT\n", name, shortname)
|
|
return nil, syscall.ENOENT
|
|
}
|
|
|
|
fmt.Printf("[F] FurresDir().Lookup('%v'): OK\n", name)
|
|
now := time.Now()
|
|
return &FurreFile{
|
|
Furre: furre,
|
|
_attr: fuse.Attr{
|
|
Inode: 0,
|
|
Nlink: 1,
|
|
Mode: 0400,
|
|
Size: 0,
|
|
Ctime: now,
|
|
Atime: now,
|
|
Mtime: now,
|
|
Uid: d._attr.Uid,
|
|
Gid: d._attr.Gid,
|
|
},
|
|
}, nil
|
|
}
|