# cr_mount <cryptofs file> <mount point>
# Note: You'll be asked for passphrase.
#
# cr_umount <mount point>

function cr_mount()
{
  local CRYPTOFS_LOOPDEV_NAME
  local CRYPTOFS_MAP_NAME

  if [ $# -gt 1 ]; then
    CRYPTOFS_MAP_NAME=cryptofs$( date +%s%N )
    CRYPTOFS_LOOPDEV_NAME=$( losetup -j $( realpath "${1}" ) | cut -d : -f 1; )
    if [ -z "$CRYPTOFS_LOOPDEV_NAME" ]; then
      CRYPTOFS_MAP_LOOP=$( losetup -f --show $( realpath "${1}" ) ) || return 1;
    else
      echo REMOVING UNNEEDED LOOP DEVICES
      losetup -d "${CRYPTOFS_LOOPDEV_NAME}"
    fi
    cryptsetup create "${CRYPTOFS_MAP_NAME}" "${CRYPTOFS_MAP_LOOP}" && \
    mount "/dev/mapper/${CRYPTOFS_MAP_NAME}" "${2}" && { echo Mounted "${1}" properly. Use cr_umount to unmount.; } || \
    {
      echo Mount failed. Bad password?; \
      cryptsetup remove "${CRYPTOFS_MAP_NAME}" "${CRYPTOFS_MAP_LOOP}" ; \
      losetup -d "${CRYPTOFS_MAP_LOOP}";
    }
  else
    echo "${FUNCNAME} <encrypted file path> <mount point>"
  fi
}

function cr_umount()
{
  local CRYPTOFS_LOOPDEV_NAME
  local CRYPTOFS_MAP_NAME

  if [ $# -gt 0 ]; then
    CRYPTOFS_MAP_NAME=$( basename $( df "${1}" --output=source | ( read; read -r devn ; echo "${devn}" ) ) ) || return 1;
    CRYPTOFS_LOOPDEV_NAME=$( cryptsetup status "${CRYPTOFS_MAP_NAME}" | sed -n 's/\(.*device:  \)\(.*\).*$/\2/p' ) || return 1;
    mount | fgrep mapper &> /dev/null && { umount "${1}" || return 1; } || echo Not mounted.
    if [ -n "${CRYPTOFS_MAP_NAME}" -a -n "${CRYPTOFS_LOOPDEV_NAME}" ]; then
      cryptsetup remove "${CRYPTOFS_MAP_NAME}"
      losetup -d "${CRYPTOFS_LOOPDEV_NAME}"
    fi
  else
    echo "${FUNCNAME} <mount point>"
  fi
}
