Allow partial result of getdents

This commit is contained in:
Wildan M
2025-09-23 23:34:26 +07:00
parent 0cb6f3cad5
commit 4af64e157a
+12 -3
View File
@@ -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)
}