Refactored HelloFS.
parent
12003cad3e
commit
e57dade603
|
@ -31,6 +31,36 @@ const (
|
||||||
worldInode
|
worldInode
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type inodeInfo struct {
|
||||||
|
// File or directory?
|
||||||
|
dir bool
|
||||||
|
|
||||||
|
// For directories, children.
|
||||||
|
children []fuseutil.Dirent
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have a fixed directory structure.
|
||||||
|
var gInodeInfo = map[fuse.InodeID]inodeInfo{
|
||||||
|
// root
|
||||||
|
rootInode: inodeInfo{
|
||||||
|
dir: true,
|
||||||
|
children: []fuseutil.Dirent{
|
||||||
|
fuseutil.Dirent{
|
||||||
|
Offset: 1,
|
||||||
|
Inode: helloInode,
|
||||||
|
Name: "hello",
|
||||||
|
Type: fuseutil.DT_File,
|
||||||
|
},
|
||||||
|
fuseutil.Dirent{
|
||||||
|
Offset: 2,
|
||||||
|
Inode: dirInode,
|
||||||
|
Name: "dir",
|
||||||
|
Type: fuseutil.DT_Directory,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func (fs *HelloFS) OpenDir(
|
func (fs *HelloFS) OpenDir(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *fuse.OpenDirRequest) (resp *fuse.OpenDirResponse, err error) {
|
req *fuse.OpenDirRequest) (resp *fuse.OpenDirResponse, err error) {
|
||||||
|
@ -45,37 +75,25 @@ func (fs *HelloFS) OpenDir(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// We have a fixed directory structure.
|
|
||||||
var gDirectoryEntries = map[fuse.InodeID][]fuseutil.Dirent{
|
|
||||||
// root
|
|
||||||
rootInode: []fuseutil.Dirent{
|
|
||||||
fuseutil.Dirent{
|
|
||||||
Offset: 1,
|
|
||||||
Inode: helloInode,
|
|
||||||
Name: "hello",
|
|
||||||
Type: fuseutil.DT_File,
|
|
||||||
},
|
|
||||||
fuseutil.Dirent{
|
|
||||||
Offset: 2,
|
|
||||||
Inode: dirInode,
|
|
||||||
Name: "dir",
|
|
||||||
Type: fuseutil.DT_Directory,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fs *HelloFS) ReadDir(
|
func (fs *HelloFS) ReadDir(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *fuse.ReadDirRequest) (resp *fuse.ReadDirResponse, err error) {
|
req *fuse.ReadDirRequest) (resp *fuse.ReadDirResponse, err error) {
|
||||||
resp = &fuse.ReadDirResponse{}
|
resp = &fuse.ReadDirResponse{}
|
||||||
|
|
||||||
// Find the entries for this inode.
|
// Find the info for this inode.
|
||||||
entries, ok := gDirectoryEntries[req.Inode]
|
info, ok := gInodeInfo[req.Inode]
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fuse.ENOENT
|
err = fuse.ENOENT
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !info.dir {
|
||||||
|
err = fuse.EIO
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
entries := info.children
|
||||||
|
|
||||||
// Grab the range of interest.
|
// Grab the range of interest.
|
||||||
if req.Offset > fuse.DirOffset(len(entries)) {
|
if req.Offset > fuse.DirOffset(len(entries)) {
|
||||||
err = fuse.EIO
|
err = fuse.EIO
|
||||||
|
|
Loading…
Reference in New Issue