1 // Copyright 2020 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 //! It contains common utils shared within sound_card_init.
5 #![deny(missing_docs)]
6
7 use std::fs::File;
8 use std::io::{prelude::*, BufReader, BufWriter};
9 use std::path::PathBuf;
10 use std::time::Duration;
11
12 use crate::datastore::Datastore;
13 use crate::error::{Error, Result};
14
duration_from_file(path: &PathBuf) -> Result<Duration>15 fn duration_from_file(path: &PathBuf) -> Result<Duration> {
16 let reader =
17 BufReader::new(File::open(&path).map_err(|e| Error::FileIOFailed(path.clone(), e))?);
18 serde_yaml::from_reader(reader).map_err(|e| Error::SerdeError(path.clone(), e))
19 }
20
21 /// The utils to parse CRAS shutdown time file.
22 pub mod shutdown_time {
23 use super::*;
24 // The path of CRAS shutdown time file.
25 const SHUTDOWN_TIME_FILE: &str = "/var/lib/cras/stop";
26
27 /// Reads the unix time from CRAS shutdown time file.
from_file() -> Result<Duration>28 pub fn from_file() -> Result<Duration> {
29 duration_from_file(&PathBuf::from(SHUTDOWN_TIME_FILE))
30 }
31 }
32
33 /// The utils to create and parse sound_card_init run time file.
34 pub mod run_time {
35 use std::time::SystemTime;
36
37 use super::*;
38 // The filename of sound_card_init run time file.
39 const RUN_TIME_FILE: &str = "run";
40
41 /// Returns the sound_card_init run time file existence.
exists(snd_card: &str) -> bool42 pub fn exists(snd_card: &str) -> bool {
43 run_time_file(snd_card).exists()
44 }
45
46 /// Reads the unix time from sound_card_init run time file.
from_file(snd_card: &str) -> Result<Duration>47 pub fn from_file(snd_card: &str) -> Result<Duration> {
48 duration_from_file(&run_time_file(snd_card))
49 }
50
51 /// Saves the current unix time to sound_card_init run time file.
now_to_file(snd_card: &str) -> Result<()>52 pub fn now_to_file(snd_card: &str) -> Result<()> {
53 match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
54 Ok(t) => to_file(snd_card, t),
55 Err(e) => Err(Error::SystemTimeError(e)),
56 }
57 }
58
59 /// Saves the unix time to sound_card_init run time file.
to_file(snd_card: &str, duration: Duration) -> Result<()>60 pub fn to_file(snd_card: &str, duration: Duration) -> Result<()> {
61 let path = run_time_file(snd_card);
62 let mut writer =
63 BufWriter::new(File::create(&path).map_err(|e| Error::FileIOFailed(path.clone(), e))?);
64 writer
65 .write_all(
66 serde_yaml::to_string(&duration)
67 .map_err(|e| Error::SerdeError(path.clone(), e))?
68 .as_bytes(),
69 )
70 .map_err(|e| Error::FileIOFailed(path.clone(), e))?;
71 writer
72 .flush()
73 .map_err(|e| Error::FileIOFailed(path.clone(), e))?;
74 Ok(())
75 }
76
run_time_file(snd_card: &str) -> PathBuf77 fn run_time_file(snd_card: &str) -> PathBuf {
78 PathBuf::from(Datastore::DATASTORE_DIR)
79 .join(snd_card)
80 .join(RUN_TIME_FILE)
81 }
82 }
83