1use std::io::prelude::*;
2use std::io::BufReader;
3use std::{fs::File, process};
4
5#[derive(Debug, Clone)]
7pub struct ModInfo {
8 pub name: String,
9 pub mem_size: usize,
10 pub mem_offset: usize, pub instances: u8,
12 pub dependencies: Vec<String>,
13}
14
15pub 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}