procfs_core/
partitions.rs

1use std::io::BufRead;
2
3use super::ProcResult;
4use std::str::FromStr;
5
6#[cfg(feature = "serde1")]
7use serde::{Deserialize, Serialize};
8
9/// A partition entry under `/proc/partitions`
10#[derive(Debug, Clone)]
11#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
12#[allow(non_snake_case)]
13pub struct PartitionEntry {
14    /// Device major number
15    pub major: u16,
16    /// Device minor number
17    pub minor: u16,
18    /// Number of 1024 byte blocks
19    pub blocks: u64,
20    /// Device name
21    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}