1#!/bin/sh
2
3mmc_init() {
4  base_dir="/media/hostfw"
5  running_dir="${base_dir}/running"
6  prsv_dir="${base_dir}/prsv"
7
8  if [ ! -d "${running_dir}" ]; then
9    mkdir -p ${running_dir}
10  fi
11  if [ ! -d "${prsv_dir}" ]; then
12    mkdir -p "${prsv_dir}"
13  fi
14
15  # Determine if the running dir contains the running version
16  boot_label="$(fw_printenv -n bootside)"
17  running_label=""
18  running_label_file="${running_dir}/partlabel"
19  if [ -f "${running_label_file}" ]; then
20    running_label=$(cat ${running_label_file})
21  fi
22  if [ "${running_label}" != "${boot_label}" ]; then
23    # Copy off the preserved partitions
24    # A line in the pnor.toc looks like this:
25    # partition05=SECBOOT,0x00381000,0x003a5000,00,ECC,PRESERVED
26    rm -f ${prsv_dir}/*
27    if [ -f ${running_dir}/pnor.toc ]; then
28      prsvs=$(grep PRESERVED ${running_dir}/pnor.toc)
29      for prsv in ${prsvs}; do
30        prsv=${prsv##partition*=}
31        prsv=$(echo ${prsv} | cut -d "," -f 1)
32        cp -p ${running_dir}/${prsv} ${prsv_dir}
33      done
34    fi
35
36    # Copy contents of running image to running dir
37    tmp_dir="/tmp/hostfw"
38    mkdir -p "${tmp_dir}"
39    mount ${base_dir}/hostfw-${boot_label} ${tmp_dir} -o ro
40    rm -f ${running_dir}/*
41    cp -p ${tmp_dir}/* ${running_dir}/
42    umount ${tmp_dir}
43    rm -rf ${tmp_dir}
44
45    # Restore the preserved partitions
46    cp -p ${prsv_dir}/* ${running_dir}/ || true
47    rm -f ${prsv_dir}/*
48
49    # Save the label
50    echo "${boot_label}" > "${running_label_file}"
51
52    # Remove patches
53    rm -f ${base_dir}/patch/*
54  fi
55
56  # Mount alternate dir
57  if [ "${boot_label}" = "a" ]; then
58    alternate_label="b"
59  else
60    alternate_label="a"
61  fi
62  alternate_dir="${base_dir}/alternate"
63  if [ ! -d "${alternate_dir}" ]; then
64    mkdir -p ${alternate_dir}
65  fi
66  mount ${base_dir}/hostfw-${alternate_label} ${alternate_dir} -o ro
67}
68
69mmc_patch() {
70  # Patching is disabled if field mode is set
71  if [[ "$(fw_printenv fieldmode 2>/dev/null)" == "fieldmode=true" ]]; then
72    return 0
73  fi
74
75  target="/media/hostfw/patch"
76  if [ ! -d "${target}" ]; then
77    mkdir -p "${target}"
78  fi
79
80  patchdir="/usr/local/share"
81  if [ ! -d "${patchdir}" ]; then
82    mkdir -p "${patchdir}"
83  fi
84
85  ln -s "${target}" "${patchdir}/hostfw"
86  ln -s "${target}" "${patchdir}/pnor"
87}
88
89case "$1" in
90  mmc-init)
91    mmc_init
92    ;;
93  mmc-patch)
94    mmc_patch
95    ;;
96  *)
97    echo "Invalid argument"
98    exit 1
99    ;;
100esac
101