fn readdir()

in src/fs.rs [392:440]


    fn readdir(
        &mut self,
        _req: &Request,
        inode: Inode,
        _fh: u64,
        offset: i64,
        mut reply: ReplyDirectory,
    ) {
        debug!("Trying to readdir on {} with offset {}", inode, offset);
        if let Some(dir_ent) = self.directory_map.read().unwrap().get(&inode) {
            debug!(
                "  directory {} has {} entries ({:#?})",
                inode,
                dir_ent.entries.len(),
                dir_ent.entries
            );
            let mut absolute_index = offset + 1;
            for (idx, ref child_pair) in dir_ent.entries.iter().skip(offset as usize).enumerate() {
                debug!(
                    "    looking at entry {}, got back pair {:#?}",
                    idx, child_pair
                );

                if let Some(child_ent) = self.inode_to_attr.read().unwrap().get(&child_pair.1) {
                    debug!(
                        "  readdir for inode {}, adding '{}' as inode {}",
                        inode, child_pair.0, child_pair.1
                    );
                    if reply.add(
                        child_pair.1,
                        absolute_index as i64,
                        child_ent.kind,
                        &child_pair.0,
                    ) {
                        // We've filled up our reply buffer. Exit.
                        break;
                    }
                    absolute_index += 1;
                } else {
                    debug!("  readdir for inode {}, could not find inode {} which was given in dir_ent as '{}'", inode, child_pair.1, child_pair.0);
                    reply.error(ENOENT);
                    return;
                }
            }
            reply.ok();
        } else {
            reply.error(ENOENT);
        }
    }