#!/bin/bash
# Copyright (c) 2019 Huawei Technologies Co., Ltd. All rights reserved.
# This script runs exagear

. ${EXAGEAR_CORE_CONF}
. ${EXAGEAR_GUEST_CONF}
#NOTE: 8200 == 8192 (default value of hifd-reserve of ubt) - 8 (count of reserved fds for hifd)
if [ `ulimit -Hn` -lt 8200 ] #Limit is too low.
then
    if ! ulimit -Hn 8200 2>/dev/null   # Try to rise it
    then
        if [ `ulimit -Hn` -lt 32 ]
        then
            echo "Exagear:  Fatal error: ulimit (NOFILE) must be > 32"
            exit 1
        fi

        # Failed to rise, put fd limit lower (static area will be placed on lower fd numbers)
        EXAGEAR_FD_HARD_LIMIT=$((`ulimit -Hn` - 16))
    fi
fi

. /opt/exagear/shared/ubt-make-opt-cmdline

IMAGE_DIR=/opt/exagear/images/${EXAGEAR_GUEST_IMAGE_NAME}
VPATHS_LIST="${IMAGE_DIR}/.exagear/vpaths-list"
OPATHS_LIST="${IMAGE_DIR}/.exagear/opaths-list"
UTMP_LIST="${IMAGE_DIR}/.exagear/utmp-list"

if [ "${EXAGEAR_USE_OPT}" == "y" ]
then
    if [ ! -z "${EXAGEAR_OPT_SOCKET}" -a \( -z "${EXAGEAR_IN_CONTAINER}" -o "${EXAGEAR_IN_CONTAINER}" == "n" \) ]
    then
        if [ ! -S "${EXAGEAR_OPT_SOCKET}" ]
        then
            echo "ExaGear optimizer socket ${EXAGEAR_OPT_SOCKET} doesn't exist! Enable optimizer service or disable optimizer in config."
            exit 1
        fi
    else
        if [ ! -f "${EXAGEAR_OPT_BINARY}" ]
        then
            echo "ExaGear optimizer binary ${EXAGEAR_OPT_BINARY} doesn't exist! Reinstall ExaGear or disable optimizer in config."
            exit 1
        fi
    fi
fi

if exagear-manage binfmt_misc ${EXAGEAR_GUEST_ARCH_NAME} status
then
    SUGID_EXEC_METHOD="--use-binfmt_misc"
fi

C=''
for i in "$@"; do
    i="${i//\\/\\\\}"
    C="$C \"${i//\"/\\\"}\""
done
CMDLINE_OPTS=`exagear_make_opt_cmdline`


if [ `cat /proc/sys/kernel/perf_event_paranoid` -ge 3 ]
then
    echo "Failed to start exagear. /proc/sys/kernel/perf_event_paranoid == $(cat /proc/sys/kernel/perf_event_paranoid) but it must be <= 2."
    exit 1
fi

exec ${EXAGEAR_UBT_BINARY} --path-prefix ${IMAGE_DIR} --utmp-paths-list ${UTMP_LIST} --vpaths-list ${VPATHS_LIST} --opaths-list ${OPATHS_LIST} ${SUGID_EXEC_METHOD} ${CMDLINE_OPTS} -- \
/bin/bash -c  "${C}"
