Отображать метаданные файла, такие как владелец и группа, используя Rust - PullRequest
0 голосов
/ 05 февраля 2019

Я работаю с рекурсивным поиском файлов и заставил его работать с простыми разрешениями, но я не могу определить, как получить владельца (идентификатор владельца) или группу (идентификатор группы) папки или файла.Я обнаружил, как получить текущие права доступа к файлу или папке.Я получаю uint_32, поэтому около 9 бит используются для сохранения разрешения.Но где и как сохраняется временная метка?а хозяин?В своих исследованиях я читал, что ядро ​​linux позволяет использовать в системе более 4 миллиардов пользователей.Очевидно это не в uint_32, который я получаю.

Я работаю в ржавчине и не побоялся бы написать модуль Си.Но теперь вот мой main.rs:

use std::fs::*;
use std::os::unix::fs::MetadataExt;
use std::os::unix::fs::PermissionsExt;
use std::mem::transmute;


fn main(){
    let meta = metadata("./test.txt");
    if meta.is_ok(){
        let m:u32 = meta.unwrap().permissions().mode();
        //let bytes: [u8; 4] = unsafe { transmute(m.to_be()) };//etv. used later

        print!("{}",if (m & (0x1<<9)) >= 1 {"d"}else{"-"});
        print!("{}",if (m & (0x1<<8)) >= 1 {"r"}else{"-"});
        print!("{}",if (m & (0x1<<7)) >= 1 {"w"}else{"-"});
        print!("{}",if (m & (0x1<<6)) >= 1 {"x"}else{"-"});
        print!("{}",if (m & (0x1<<5)) >= 1 {"r"}else{"-"});
        print!("{}",if (m & (0x1<<4)) >= 1 {"w"}else{"-"});
        print!("{}",if (m & (0x1<<3)) >= 1 {"x"}else{"-"});
        print!("{}",if (m & (0x1<<2)) >= 1 {"r"}else{"-"});
        print!("{}",if (m & (0x1<<1)) >= 1 {"w"}else{"-"});
        println!("{}",if (m & 0x1) >= 1 {"x"}else{"-"});
        println!("{:b}",m);
    }
}

Не стесняйтесь изменять мой код, если вы так думаете.

Я делаю это для развлечения и узнать больше о кодепод горизонтом.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

std::os::linux::fs::MetadataExt (или os :: unix) предоставляет соответствующие функции для конкретной платформы. Ссылки .Похоже, вам нужно meta.std_uid(), meta.st_gid() и т. Д. Кстати, гораздо лучше написать ваш код так:

if let Ok(meta) = metadata("./test.txt") {
  println!("{}", meta.st_gid());
  // ...
}

Я работаю в ржавчине и не будубоюсь писать модуль C

Rust имеет отличную FFI для таких случаев.Например, вы можете добавить libc ящик с привязками libc и просто вызвать функцию libc::stat со знакомым API.

0 голосов
/ 05 февраля 2019

Владелец - meta.unwrap().uid(), а группа - meta.unwrap().gid().Каждый из них u32, что и используется в Linux.

Чтобы получить действительные имена, используйте libc :: getpwuid_r и libc :: getgrgid_r .См. Также getpwuid (3) и getgrgid (3) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...