#!/bin/sh

mmc_init() {
  base_dir="/media/hostfw"
  running_dir="${base_dir}/running"
  prsv_dir="${base_dir}/prsv"

  if [ ! -d "${running_dir}" ]; then
    mkdir -p ${running_dir}
  fi
  if [ ! -d "${prsv_dir}" ]; then
    mkdir -p "${prsv_dir}"
  fi

  # Determine if the running dir contains the running version
  boot_label="$(fw_printenv -n bootside)"
  running_label=""
  running_label_file="${running_dir}/partlabel"
  if [ -f "${running_label_file}" ]; then
    running_label=$(cat ${running_label_file})
  fi
  if [ "${running_label}" != "${boot_label}" ]; then
    # Copy off the preserved partitions
    # A line in the pnor.toc looks like this:
    # partition05=SECBOOT,0x00381000,0x003a5000,00,ECC,PRESERVED
    rm -f ${prsv_dir}/*
    if [ -f ${running_dir}/pnor.toc ]; then
      prsvs=$(grep PRESERVED ${running_dir}/pnor.toc)
      for prsv in ${prsvs}; do
        prsv=${prsv##partition*=}
        prsv=$(echo ${prsv} | cut -d "," -f 1)
        cp -p ${running_dir}/${prsv} ${prsv_dir}
      done
    fi

    # Copy contents of running image to running dir
    tmp_dir="/tmp/hostfw"
    mkdir -p "${tmp_dir}"
    mount ${base_dir}/hostfw-${boot_label} ${tmp_dir} -o ro
    rm -f ${running_dir}/*
    cp -p ${tmp_dir}/* ${running_dir}/
    umount ${tmp_dir}
    rm -rf ${tmp_dir}

    # Restore the preserved partitions
    cp -p ${prsv_dir}/* ${running_dir}/ || true
    rm -f ${prsv_dir}/*

    # Save the label
    echo "${boot_label}" > "${running_label_file}"

    # Remove patches
    rm -f ${base_dir}/patch/*
  fi

  # Mount alternate dir
  if [ "${boot_label}" = "a" ]; then
    alternate_label="b"
  else
    alternate_label="a"
  fi
  alternate_dir="${base_dir}/alternate"
  if [ ! -d "${alternate_dir}" ]; then
    mkdir -p ${alternate_dir}
  fi
  mount ${base_dir}/hostfw-${alternate_label} ${alternate_dir} -o ro
}

mmc_patch() {
  # Patching is disabled if field mode is set
  if [[ "$(fw_printenv fieldmode 2>/dev/null)" == "fieldmode=true" ]]; then
    return 0
  fi

  target="/media/hostfw/patch"
  if [ ! -d "${target}" ]; then
    mkdir -p "${target}"
  fi

  patchdir="/usr/local/share"
  if [ ! -d "${patchdir}" ]; then
    mkdir -p "${patchdir}"
  fi

  ln -s "${target}" "${patchdir}/hostfw"
  ln -s "${target}" "${patchdir}/pnor"
}

case "$1" in
  mmc-init)
    mmc_init
    ;;
  mmc-patch)
    mmc_patch
    ;;
  *)
    echo "Invalid argument"
    exit 1
    ;;
esac
