Commit 1e1606d8 authored by Ivan Krasin's avatar Ivan Krasin

FileSystem.List added

parent 84e8a52b
......@@ -14,6 +14,7 @@ const (
)
type FileSystem interface {
List(parent string) (names []string, code Error, err os.Error)
Lookup(parent, filename string) (out *Attr, code Error, err os.Error)
GetAttr(h *InHeader, in *GetAttrIn) (out *AttrOut, code Error, err os.Error)
}
......@@ -429,7 +430,12 @@ func (m *manager) openDir(req *managerRequest) (resp *managerResponse) {
h.nodeId = req.nodeId
h.req = make(chan *dirRequest, 1)
m.dirHandles[h.fh] = h
go readDirRoutine(m.client, h.req)
dir, ok := m.nodes[req.nodeId]
if !ok {
resp.err = os.NewError(fmt.Sprintf("Can't find an entry with nodeId = %d", req.nodeId))
return
}
go readDirRoutine(dir, m.fs, m.client, h.req)
resp.fh = h.fh
return
}
......@@ -488,11 +494,20 @@ func (m *manager) lookup(req *managerRequest) (resp *managerResponse) {
return
}
func readDirRoutine(c *managerClient, requests chan *dirRequest) {
func readDirRoutine(dir string, fs FileSystem, c *managerClient, requests chan *dirRequest) {
defer close(requests)
dirs := []string { "lala111", "bb", "ddddd" }
dir = path.Clean(dir)
names, code, err := fs.List(dir)
i := uint64(0)
for req := range requests {
if err != nil {
req.resp <- &dirResponse{ nil, err }
return
}
if code != OK {
req.resp <- &dirResponse { nil, os.NewError(fmt.Sprintf("fs.List returned code: %d", code))}
return
}
if req.offset != i {
fmt.Printf("readDirRoutine: i = %v, changing offset to %v\n", i, req.offset)
i = req.offset
......@@ -500,9 +515,9 @@ func readDirRoutine(c *managerClient, requests chan *dirRequest) {
if req.isClose {
return
}
if i < uint64(len(dirs)) {
if i < uint64(len(names)) {
entry := new(dirEntry)
entry.name = dirs[i]
entry.name = names[i]
lookupResp := c.lookup(req.nodeId, entry.name)
if lookupResp.err != nil {
req.resp <- &dirResponse { nil, lookupResp.err }
......
......@@ -30,6 +30,11 @@ func (fs *testFuse) Lookup(parent, filename string) (out *Attr, code Error, err
return
}
func (fs *testFuse) List(dir string) (names []string, code Error, err os.Error) {
names = []string { "a1", "b2", "caaaaa" }
return
}
func errorHandler(errors chan os.Error) {
for err := range errors {
log.Stderr("MountPoint.errorHandler: ", err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment