kmoddep/
modinfo.rs

1use std::io::prelude::*;
2use std::io::BufReader;
3use std::{fs::File, process};
4
5/// ModInfo contains current live module information
6#[derive(Debug, Clone)]
7pub struct ModInfo {
8    pub name: String,
9    pub mem_size: usize,
10    pub mem_offset: usize, // Available for root only
11    pub instances: u8,
12    pub dependencies: Vec<String>,
13}
14
15/// lsmod is just parse /proc/modules
16pub fn lsmod() -> Vec<ModInfo> {
17    let mut curr_mods: Vec<ModInfo> = vec![];
18    let rfe = File::open("/proc/modules");
19    if rfe.is_err() {
20        process::exit(1);
21    }
22
23    for rfe in BufReader::new(rfe.unwrap()).lines() {
24        if rfe.is_err() {
25            process::exit(1);
26        }
27
28        let mod_data: Vec<String> = rfe.unwrap().split(' ').map(str::to_string).collect();
29
30        if mod_data.len() != 6 {
31            process::exit(1);
32        }
33
34        curr_mods.push(ModInfo {
35            name: mod_data[0].to_owned(),
36            mem_size: mod_data[1].parse::<usize>().unwrap(),
37            instances: mod_data[2].parse::<u8>().unwrap(),
38            dependencies: if mod_data[3] == "-" {
39                vec![]
40            } else {
41                mod_data[3]
42                    .strip_suffix(',')
43                    .unwrap()
44                    .split(',')
45                    .map(str::to_string)
46                    .collect()
47            },
48            mem_offset: usize::from_str_radix(mod_data[5].strip_prefix("0x").unwrap(), 0x10)
49                .unwrap(),
50        });
51    }
52
53    curr_mods
54}