#!/bin/sh
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Common library for Google Factory Tools shell scripts.

# ======================================================================
# global variables

# cgpt related configuration
CGPT_DEVICE=""
CGPT_CONFIG=""

# ======================================================================
# message and error handling

# usage: alert messages...
alert() {
  echo "$*" 1>&2
}

# usage: die messages...
die() {
  alert "ERROR: $*"
  exit 1
}

# ======================================================================
# cgpt utilities (works with CGPT_DEVICE by default)

# usage: cgpt_backup_status
cgpt_backup_status() {
  local partno
  local info
  local device="$CGPT_DEVICE"
  [ -e "$device" ] || die "Invalid device for cgpt: $device"
  info="$(cgpt show "$device" -q | awk '{print $3}')" ||
    die "Failed to show cgpt info for $device"
  for partno in $info; do
    echo "${partno}=$(cgpt show "$device" -i "$partno" -A)"
  done
}

# usage: cgpt_restore_status
cgpt_restore_status() {
  local info
  local partno
  local attr
  local device="$CGPT_DEVICE"
  local backup_config="$CGPT_CONFIG"
  local failure=0
  for info in $backup_config; do
    partno="$(echo $info | cut -d'=' -f1)"
    attr="$(echo $info | cut -d'=' -f2)"
    [ -n "$partno" -a -n "$attr" ] || failure=1
    cgpt add "$device" -i "$partno" -A "$attr" || failure=1
  done
  return $failure
}

# usage: cgpt_init cgpt_device
cgpt_init() {
  CGPT_DEVICE="$1"
  [ -n "$CGPT_DEVICE" -a -e "$CGPT_DEVICE" ] ||
    die "Invalid device: $CGPT_DEVICE"
  CGPT_CONFIG="$(cgpt_backup_status "$CGPT_DEVICE")" ||
    die "Failed to retrieve cgpt data."
  [ -n "$CGPT_CONFIG" ] || die "Invalid cgpt data on $CGPT_DEVICE."
}

# ======================================================================
# device name processing

# usage: device_add_partno full_device partition_no
device_add_partno() {
  local device="$1"
  local partno="$2"
  local slice=""

  case "$device" in
    /dev/sd[a-z] )
      echo "${device}${partno}"
      ;;
    /dev/mmcblk[0-9] )
      echo "${device}p${partno}"
      ;;
    * )
      for slice in "" "p" "s" ; do
        if [ -e "${device}${slice}${partno}" ]; then
          echo "${device}${slice}${partno}"
          return
        fi
      done
      die "Unknown device type: $device"
      ;;
  esac
}

# usage: device_remove_partno device_with_partition
device_remove_partno() {
  local device="$1"
  echo "$device" | sed -rn 's/p?[0-9]+$//p'
}

# ======================================================================
# chromeos specific utilities

chromeos_is_legacy_firmware() {
  [ "$(crossystem mainfw_type || echo "nonchrome")" = "nonchrome" ]
}

# usage: chromeos_invoke_postinst rootfs_dev
chromeos_invoke_postinst() {
  local rootdev="$1"
  local mount_point="$(mktemp -d)"
  local failure=0

  # Some compatible and experimental fs (e.g., ext4) may be buggy and still try
  # to write the file system even if we mount it with "ro" (ex, when seeing
  # journaling error in ext3, or s_kbytes_written in ext4). It is safer to
  # always mount the partition with legacy ext2. (ref: chrome-os-partner:3940)
  mount -t ext2 -o ro "$rootdev" "$mount_point" || {
    alert "Failed to mount partition $rootdev."
    rmdir "$mount_point" || true
    return 1
  }
  alert "Running postinst for $rootdev..."
  # IS_FACTORY_INSTALL is used to prevent postinst trying to update firmare.
  IS_FACTORY_INSTALL=1 IS_INSTALL=1 "$mount_point"/postinst "$rootdev" ||
    failure="$?"
  umount -f "$mount_point" ||
    alert "WARNING: Failed to unmount partition $rootdev"
  rmdir "$mount_point" || true
  if [ "$failure" != "0" ]; then
    alert "chromeos-postinst on $rootdev failed with error code $failure."
    return "$failure"
  fi
  return 0
}
