#!/bin/bash

# $1 -- Filesystem path
# $2 -- Block device
function check_emmc_matches {
  local CURRENT=$(mktemp)
  local SIZE=$(stat -c%s $1)
  dd if=/dev/$2 of=${CURRENT} \
    count=${SIZE} \
    bs=512 \
    iflag=count_bytes
  diff ${CURRENT} $1
  local DIFF_RETURN_CODE=$?
  rm ${CURRENT}
  echo ${DIFF_RETURN_CODE}
}

# $1 -- Filesystem path
# $2 -- Block device
function write_emmc {
  for i in `seq 1 5`
  do
    dd if=$1 of=/dev/$2 bs=512
    local EMMC_MATCHES=$(check_emmc_matches $1 $2)
    if [[ ${EMMC_MATCHES} -eq 0 ]]; then
      UPDATE_SUCCESS=true
      break
    fi
  done
  echo ${UPDATE_SUCCESS}
}

BL2_MATCHES=$(check_emmc_matches /boot/bl2.img mmcblk0boot0)
FIP_BIN_MATCHES=$(check_emmc_matches /boot/fip.bin mmcblk0p1)
U_BOOT_ENV_MATCHES=$(check_emmc_matches /boot/u-boot-env.bin mmcblk0boot1)

if [[ ${BL2_MATCHES} -ne 0 ]]; then
  MMCBLK_RO_PATH=/sys/block/mmcblk0boot0/force_ro

  # Get the read-only setting for the bootloader
  MMCBLK_RO=$(cat ${MMCBLK_RO_PATH})

  # Disable read-only on bootloader block device
  echo 0 > ${MMCBLK_RO_PATH}

  UPDATE_SUCCESS=$(write_emmc /boot/bl2.img mmcblk0boot0)

  # Restore whatever the setting was before
  echo ${MMCBLK_RO} > ${MMCBLK_RO_PATH}

  if [[ "${UPDATE_SUCCESS}" != true ]]; then
    echo "Failed to update bl2! Rebooting is unsafe!"
    exit 1
  fi
fi

if [[ ${FIP_BIN_MATCHS} -ne 0 ]]; then
  UPDATE_SUCCESS=$(write_emmc /boot/fip.bin mmcblk0p1)
  if [[ "${UPDATE_SUCCESS}" != true ]]; then
    echo "Failed to update fip.bin! Rebooting is unsafe!"
    exit 1
  fi
fi

if [[ ${U_BOOT_ENV_MATCHS} -ne 0 ]]; then
  UPDATE_SUCCESS=$(write_emmc /boot/u-boot-env.bin mmcblk0boot1)
  if [[ "${UPDATE_SUCCESS}" != true ]]; then
    echo "Failed to update u-boot-env.bin! Rebooting is unsafe!"
    exit 1
  fi
fi
