Allow partial result of getdents
This commit is contained in:
@@ -251,9 +251,10 @@ impl<D: Disk> Resource<D> for DirResource {
|
||||
) -> Result<DirentBuf<&'buf mut [u8]>> {
|
||||
match &self.data {
|
||||
Some(data) => {
|
||||
for (idx, entry) in data.iter().enumerate().skip(opaque_offset as usize) {
|
||||
let opaque_offset = opaque_offset as usize;
|
||||
for (idx, entry) in data.iter().enumerate().skip(opaque_offset) {
|
||||
let child = tx.read_tree(entry.node_ptr)?;
|
||||
buf.entry(DirEntry {
|
||||
let result = buf.entry(DirEntry {
|
||||
inode: child.id() as u64,
|
||||
next_opaque_id: idx as u64 + 1,
|
||||
name: &entry.name,
|
||||
@@ -264,7 +265,15 @@ impl<D: Disk> Resource<D> for DirResource {
|
||||
//TODO: more types?
|
||||
_ => DirentKind::Unspecified,
|
||||
},
|
||||
})?;
|
||||
});
|
||||
if let Err(err) = result {
|
||||
if err.errno == EINVAL && idx > opaque_offset {
|
||||
// POSIX allows partial result of getdents
|
||||
break;
|
||||
} else {
|
||||
return Err(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(buf)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user