sysctl/linux/
funcs.rs

1// linux/funcs.rs
2
3use ctl_error::*;
4use ctl_value::*;
5
6use std::io::{Read, Write};
7
8pub fn path_to_name(name: &str) -> String {
9    name.to_owned()
10        .replace("/proc/sys/", "")
11        .replace("..", ".")
12        .replace("/", ".")
13}
14
15pub fn value(name: &str) -> Result<CtlValue, SysctlError> {
16    let file_res = std::fs::OpenOptions::new()
17        .read(true)
18        .write(false)
19        .open(&name);
20
21    file_res
22        .map(|mut file| {
23            let mut v = String::new();
24            file.read_to_string(&mut v)?;
25            Ok(CtlValue::String(v.trim().to_owned()))
26        })
27        .map_err(|e| {
28            if e.kind() == std::io::ErrorKind::NotFound {
29                SysctlError::NotFound(name.into())
30            } else {
31                e.into()
32            }
33        })?
34}
35
36pub fn set_value(name: &str, v: CtlValue) -> Result<CtlValue, SysctlError> {
37    let file_res = std::fs::OpenOptions::new()
38        .read(false)
39        .write(true)
40        .open(&name);
41
42    file_res
43        .map(|mut file| match v {
44            CtlValue::String(v) => {
45                file.write_all(&v.as_bytes())?;
46                value(&name)
47            }
48            _ => Err(std::io::Error::from(std::io::ErrorKind::InvalidData).into()),
49        })
50        .map_err(|e| {
51            if e.kind() == std::io::ErrorKind::NotFound {
52                SysctlError::NotFound(name.into())
53            } else {
54                e.into()
55            }
56        })?
57}