• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 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 
5 use std::fs::File;
6 use std::io::BufRead;
7 use std::io::BufReader;
8 
9 use crate::fdt::{Error, FdtWriter, Result};
10 
parse_fstab_line(line: &str) -> Result<Vec<String>>11 fn parse_fstab_line(line: &str) -> Result<Vec<String>> {
12     let vec: Vec<&str> = line.split_whitespace().collect();
13     if vec.len() != 5 {
14         return Err(Error::FdtFileParseError);
15     }
16     Ok(vec.iter().map(|s| s.to_string()).collect())
17 }
18 
19 /// Creates a flattened device tree containing all of the parameters used
20 /// by Android.
21 ///
22 /// # Arguments
23 ///
24 /// * `fdt` - The DTB to modify. The top-most node should be open.
25 /// * `android-fstab` - A text file of Android fstab entries to add to the DTB
create_android_fdt(fdt: &mut FdtWriter, fstab: File) -> Result<()>26 pub fn create_android_fdt(fdt: &mut FdtWriter, fstab: File) -> Result<()> {
27     let vecs = BufReader::new(fstab)
28         .lines()
29         .map(|l| parse_fstab_line(&l.map_err(Error::FdtIoError)?))
30         .collect::<Result<Vec<Vec<String>>>>()?;
31     let firmware_node = fdt.begin_node("firmware")?;
32     let android_node = fdt.begin_node("android")?;
33     fdt.property_string("compatible", "android,firmware")?;
34 
35     let (dtprop, fstab): (_, Vec<_>) = vecs.into_iter().partition(|x| x[0] == "#dt-vendor");
36     let vendor_node = fdt.begin_node("vendor")?;
37     for vec in dtprop {
38         let content = std::fs::read_to_string(&vec[2]).map_err(Error::FdtIoError)?;
39         fdt.property_string(&vec[1], &content)?;
40     }
41     fdt.end_node(vendor_node)?;
42     let fstab_node = fdt.begin_node("fstab")?;
43     fdt.property_string("compatible", "android,fstab")?;
44     for vec in fstab {
45         let partition = &vec[1][1..];
46         let partition_node = fdt.begin_node(partition)?;
47         fdt.property_string("compatible", &("android,".to_owned() + partition))?;
48         fdt.property_string("dev", &vec[0])?;
49         fdt.property_string("type", &vec[2])?;
50         fdt.property_string("mnt_flags", &vec[3])?;
51         fdt.property_string("fsmgr_flags", &vec[4])?;
52         fdt.end_node(partition_node)?;
53     }
54     fdt.end_node(fstab_node)?;
55     fdt.end_node(android_node)?;
56     fdt.end_node(firmware_node)?;
57     Ok(())
58 }
59