118 lines
2.8 KiB
Go
118 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"fusetest/ffs"
|
|
"fusetest/furcadia"
|
|
"log"
|
|
"os"
|
|
"sync"
|
|
"time"
|
|
|
|
"bazil.org/fuse"
|
|
"bazil.org/fuse/fs"
|
|
)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// TYPE: File /////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
type File struct {
|
|
mu sync.Mutex
|
|
name string
|
|
data []byte
|
|
}
|
|
|
|
func (f *File) Access(ctx context.Context, req *fuse.AccessRequest) error {
|
|
fmt.Printf("[D] File[%v].Attr() <- %v\n", f.name, req.String())
|
|
return nil
|
|
}
|
|
|
|
func (f *File) Attr(ctx context.Context, a *fuse.Attr) error {
|
|
f.mu.Lock()
|
|
defer f.mu.Unlock()
|
|
|
|
a.Inode = 12345
|
|
a.Mode = 0755
|
|
a.Size = uint64(len(f.data))
|
|
a.Gid = 999
|
|
a.Uid = 999
|
|
a.Atime = time.Now()
|
|
a.Mtime = time.Now()
|
|
fmt.Printf("[D] File[%v].Attr() <- %v\n", f.name, a.String())
|
|
return nil
|
|
}
|
|
|
|
func (f *File) ReadAll(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) ([]byte, error) {
|
|
f.mu.Lock()
|
|
defer f.mu.Unlock()
|
|
fmt.Printf("[D] File[%v].ReadAll(%v) <- %v\n", f.name, req.String(), resp.String())
|
|
return append([]byte(nil), f.data...), nil
|
|
}
|
|
|
|
func (f *File) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
|
|
f.mu.Lock()
|
|
defer f.mu.Unlock()
|
|
|
|
end := int(req.Offset) + len(req.Data)
|
|
if end > len(f.data) {
|
|
newData := make([]byte, end)
|
|
copy(newData, f.data)
|
|
f.data = newData
|
|
}
|
|
copy(f.data[req.Offset:], req.Data)
|
|
resp.Size = len(req.Data)
|
|
|
|
fmt.Printf("[D] File[%v].Write(%v) <- %v\n", f.name, req.String(), resp.String())
|
|
return nil
|
|
}
|
|
|
|
func (f *File) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
|
|
fmt.Printf("[D] File[%v].Open(%v) <- %v\n", f.name, req.String(), resp.String())
|
|
return f, nil
|
|
}
|
|
|
|
func (f *File) Release(ctx context.Context, req *fuse.ReleaseRequest) error {
|
|
fmt.Printf("[D] File[%v].Release(%v)\n", f.name, req.String())
|
|
return nil
|
|
}
|
|
|
|
func (f *File) Forget() {
|
|
fmt.Printf("[D] File[%v].Forget()\n", f.name)
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
func main() {
|
|
if len(os.Args) != 2 {
|
|
fmt.Printf("Usage: %v <mountpoint>\n", os.Args[0])
|
|
os.Exit(1)
|
|
}
|
|
mountpoint := os.Args[1]
|
|
|
|
c, err := fuse.Mount(
|
|
mountpoint,
|
|
fuse.FSName("rawrfs"),
|
|
fuse.Subtype("rawrfs"),
|
|
)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer fuse.Unmount(mountpoint)
|
|
defer c.Close()
|
|
|
|
uid := uint32(os.Getuid())
|
|
gid := uint32(os.Getgid())
|
|
|
|
pounce := furcadia.NewPounceList()
|
|
pounce.AddDream("Artex", "Some dream name")
|
|
pounce.AddDream("Ice Dragon", "")
|
|
pounce.AddDream("Albert Quirky", "Welcome!")
|
|
|
|
pfs := ffs.InitFS(uid, gid, pounce)
|
|
if err := fs.Serve(c, pfs); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|