diff --git a/database.go b/database.go index ee578c4..a81b613 100644 --- a/database.go +++ b/database.go @@ -23,6 +23,7 @@ package main import ( + "bazil.org/fuse/fs" "io/ioutil" "path/filepath" ) @@ -113,6 +114,10 @@ func (this *database) scan(dir string) ([]string, error) { return dirs, nil } +func (this *database) Root() (fs.Node, error) { + return this.lastVersion().root, nil +} + func (this *database) AllocInode() uint64 { this.inodeCnt++ return this.inodeCnt diff --git a/file.go b/file.go index b133c8e..2d55671 100644 --- a/file.go +++ b/file.go @@ -25,6 +25,7 @@ package main import ( "bazil.org/fuse" "golang.org/x/net/context" + "io/ioutil" ) type versionedFile struct { @@ -42,6 +43,11 @@ func (this versionedFile) Attr(attr *fuse.Attr) { attr.Size = uint64(this.node.info.Size()) } -func (versionedFile) ReadAll(ctx context.Context) ([]byte, error) { - return nil, nil +func (this versionedFile) ReadAll(ctx context.Context) ([]byte, error) { + bytes, err := ioutil.ReadFile(this.node.rebasedPath()) + if err != nil { + return nil, err + } + + return bytes, nil } diff --git a/mount.go b/mount.go deleted file mode 100644 index fbeadf9..0000000 --- a/mount.go +++ /dev/null @@ -1,91 +0,0 @@ -// Hellofs implements a simple "hello world" file system. -package main - -import ( - "bazil.org/fuse" - "bazil.org/fuse/fs" - // "flag" - // "fmt" - "golang.org/x/net/context" - "os" -) - -// func main() { -// flag.Usage = Usage -// flag.Parse() - -// if flag.NArg() != 1 { -// Usage() -// os.Exit(2) -// } -// mountpoint := flag.Arg(0) - -// c, err := fuse.Mount( -// mountpoint, -// fuse.FSName("helloworld"), -// fuse.Subtype("hellofs"), -// fuse.LocalVolume(), -// fuse.VolumeName("Hello world!"), -// ) -// if err != nil { -// log.Fatal(err) -// } -// defer c.Close() - -// err = fs.Serve(c, FS{}) -// if err != nil { -// log.Fatal(err) -// } - -// // check if the mount process has an error to report -// <-c.Ready -// if err := c.MountError; err != nil { -// log.Fatal(err) -// } -// } - -// FS implements the hello world file system. -type FS struct{} - -func (FS) Root() (fs.Node, error) { - return Dir{}, nil -} - -// Dir implements both Node and Handle for the root directory. -type Dir struct{} - -func (Dir) Attr(a *fuse.Attr) { - a.Inode = 1 - a.Mode = os.ModeDir | 0777 -} - -func (Dir) Lookup(ctx context.Context, name string) (fs.Node, error) { - - if name == "hello" { - return File{}, nil - } - return nil, fuse.ENOENT -} - -var dirDirs = []fuse.Dirent{ - {Inode: 2, Name: "hello", Type: fuse.DT_File}, -} - -func (Dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { - return dirDirs, nil -} - -// File implements both Node and Handle for the hello file. -type File struct{} - -const greeting = "hello, world\n" - -func (File) Attr(a *fuse.Attr) { - a.Inode = 2 - a.Mode = 0777 - a.Size = uint64(len(greeting)) -} - -func (File) ReadAll(ctx context.Context) ([]byte, error) { - return []byte(greeting), nil -} diff --git a/vfs.go b/vfs.go index 61da5a5..b05e4ea 100644 --- a/vfs.go +++ b/vfs.go @@ -23,6 +23,8 @@ package main import ( + "bazil.org/fuse" + "bazil.org/fuse/fs" "log" ) @@ -32,5 +34,25 @@ func main() { log.Fatal(err) } - db.lastVersion().dumpRoot() + c, err := fuse.Mount( + "mp", + fuse.FSName("helloworld"), + fuse.Subtype("hellofs"), + fuse.LocalVolume(), + fuse.VolumeName("Hello world!"), + ) + if err != nil { + log.Fatal(err) + } + defer c.Close() + + err = fs.Serve(c, db) + if err != nil { + log.Fatal(err) + } + + <-c.Ready + if err := c.MountError; err != nil { + log.Fatal(err) + } }