procfs_core/
partitions.rs1use std::io::BufRead;
2
3use super::ProcResult;
4use std::str::FromStr;
5
6#[cfg(feature = "serde1")]
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone)]
11#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
12#[allow(non_snake_case)]
13pub struct PartitionEntry {
14 pub major: u16,
16 pub minor: u16,
18 pub blocks: u64,
20 pub name: String,
22}
23
24impl super::FromBufRead for Vec<PartitionEntry> {
25 fn from_buf_read<R: BufRead>(r: R) -> ProcResult<Self> {
26 let mut vec = Vec::new();
27
28 for line in r.lines().skip(2) {
29 let line = expect!(line);
30
31 let mut s = line.split_whitespace();
32
33 let major = expect!(u16::from_str(expect!(s.next())));
34 let minor = expect!(u16::from_str(expect!(s.next())));
35 let blocks = expect!(u64::from_str(expect!(s.next())));
36 let name = expect!(s.next()).to_string();
37
38 let partition_entry = PartitionEntry {
39 major,
40 minor,
41 blocks,
42 name,
43 };
44
45 vec.push(partition_entry);
46 }
47
48 Ok(vec)
49 }
50}
51
52#[test]
53fn test_partitions() {
54 use crate::FromBufRead;
55 use std::io::Cursor;
56
57 let s = "major minor #blocks name
58
59 259 0 1000204632 nvme0n1
60 259 1 1048576 nvme0n1p1
61 259 2 1048576 nvme0n1p2
62 259 3 104857600 nvme0n1p3
63 259 4 893248512 nvme0n1p4
64 253 0 104841216 dm-0
65 252 0 8388608 zram0
66 253 1 893232128 dm-1
67 8 0 3953664 sda
68 8 1 2097152 sda1
69 8 2 1855488 sda2
70 253 2 1853440 dm-2
71";
72
73 let cursor = Cursor::new(s);
74 let partitions = Vec::<PartitionEntry>::from_buf_read(cursor).unwrap();
75 assert_eq!(partitions.len(), 12);
76
77 assert_eq!(partitions[3].major, 259);
78 assert_eq!(partitions[3].minor, 3);
79 assert_eq!(partitions[3].blocks, 104857600);
80 assert_eq!(partitions[3].name, "nvme0n1p3");
81
82 assert_eq!(partitions[11].major, 253);
83 assert_eq!(partitions[11].minor, 2);
84 assert_eq!(partitions[11].blocks, 1853440);
85 assert_eq!(partitions[11].name, "dm-2");
86}