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