#!/bin/sh

mmc_init() {
  base_dir="/media/hostfw"
  ro_dir="${base_dir}/running-ro"
  running_dir="${base_dir}/running"
  prsv_dir="${base_dir}/prsv"
  staging_dir="${base_dir}/staging"

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

  # Mount the image that corresponds to the boot label as read-only to be used
  # to populate the running directory.
  boot_label="$(fw_printenv -n bootside)"
  mount ${base_dir}/hostfw-"${boot_label}" ${ro_dir} -o ro

  # Determine if the running dir contains the running version
  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
    rm -f ${running_dir}/*
    cp -p ${ro_dir}/* ${running_dir}/

    # Restore the preserved partitions. Ignore error, there may be none.
    cp -p ${prsv_dir}/* ${running_dir}/ 2>/dev/null || true
    rm -f "${prsv_dir:?}/"*

    # Clean up the staging dir in case of a failed update
    rm -rf "${staging_dir:?}/"*

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

  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

  boot_label="$(fw_printenv -n bootside)"
  if [ "${boot_label}" = "a" ]; then
    alternate_label="b"
  else
    alternate_label="a"
  fi

  # Create patch directories
  patch_dir="/media/hostfw/patch-"
  running_patch_dir="${patch_dir}${boot_label}"
  if [ ! -d "${running_patch_dir}" ]; then
    mkdir -p "${running_patch_dir}"
  fi
  alternate_patch_dir="${patch_dir}${alternate_label}"
  if [ ! -d "${alternate_patch_dir}" ]; then
    mkdir -p "${alternate_patch_dir}"
  fi

  # Create patch symlinks
  symlink_base="/usr/local/share"
  if [ ! -d "${symlink_base}" ]; then
    mkdir -p "${symlink_base}"
  fi
  hostfw_symlink_base="${symlink_base}/hostfw"
  if [ ! -d "${hostfw_symlink_base}" ]; then
    mkdir -p "${hostfw_symlink_base}"
  fi

  ln -s "${running_patch_dir}" "${symlink_base}/pnor"
  ln -s "${running_patch_dir}" "${hostfw_symlink_base}/running"
  ln -s "${alternate_patch_dir}" "${hostfw_symlink_base}/alternate"
}

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