@iihaarr

Почему неверно каститься указатель на тип из &[u8]?

Работаю с системным вызовом 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
img1

66962fb26d2c5380379099.png

Посмотрев в buf и подсчитав отступ до d_reclen, вижу, что на самом деле размер 24, а байты (на картинки) 19 20 21 22 - это .ssh и после '\0'
img2

66963001c4238685811336.png
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
@iihaarr Автор вопроса
Навесил на структуру #[repr(packed)] - заработало
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы