Работаю с системным вызовом getdents64. Имеется структура:
pub struct Dirent {
pub d_ino: u64, /* Inode number */
pub d_off: u64,
pub d_reclen: u16, /* Length of this Dirent */
pub d_type: u8, /*File type */
pub d_name: [u8; 256], /* Filename (null-terminated) */
}
Системный вызов срабатывает нормально, в буфер записываются байты. Начинаю их парсить:
let mut bufEntries: [u8; 4096] = [0; 4096];
loop {
let readed = syscall::getdents64(dir, &mut bufEntries[..]);
if readed == 0 {
break;
}
if readed == -1 {
return None;
}
let mut buf = &mut bufEntries[0..readed as usize];
while buf.len() > 0 {
let ptr = buf.as_ptr() as *const syscall::Dirent;
let dirent = unsafe { ptr.read() };
/*Что-то еще*/
buf = &mut buf[..dirent.d_reclen as usize];
}
}
Но проблема в том, что в dirent записывается мусор, а d_name указывает на buf
Посмотрев в buf и подсчитав отступ до d_reclen, вижу, что на самом деле размер 24, а байты (на картинки) 19 20 21 22 - это .ssh и после '\0'