#!/bin/sh
# Start the isolated legacy Xorg/PVR server as a normal LightDM X server.
set -eu

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH

ROOT=${PVR_XORG_ROOT:-/opt/mcom03-pvr-xorg}
# ALT's /etc/lightdm/lightdm.conf sets xserver-command after the drop-ins, so a
# drop-in cannot select the profile.  One optional file switches it instead.
PROFILE_CONF=${MCOM03_XORG_PROFILE_CONF:-/etc/default/mcom03-xorg}
if [ -r "$PROFILE_CONF" ]; then
    # shellcheck disable=SC1090
    . "$PROFILE_CONF"
fi
PROFILE=${MCOM03_XORG_PROFILE:-copy-3d}
LOG_DIR=${MCOM03_XORG_LOG_DIR:-/var/log/mcom03-pvr}

case "$PROFILE" in
    default) CONFIG=xorg.conf ;;
    softcursor|copy-2d|copy-3d|copy-3d-artifactdebug|copy-software|\
softcursor-copy-2d|softcursor-copy-3d|artifact-debug)
        CONFIG="xorg-$PROFILE.conf"
        ;;
    *)
        echo "Unsupported MCom03R Xorg profile: $PROFILE" >&2
        exit 64
        ;;
esac

LOCAL="$ROOT/usr/local"
for path in \
        "$LOCAL/bin/Xorg" \
        "$LOCAL/etc/X11/$CONFIG" \
        "$LOCAL/lib/xorg/modules/drivers/pvr_drv.so" \
        "$LOCAL/lib/dri/pvr_dri.so" \
        "$ROOT/vendor/lib/libpvr_dri_support.so"; do
    [ -e "$path" ] || {
        echo "Required MCom03R PVR/Xorg component is absent: $path" >&2
        exit 1
    }
done

case "$(uname -r)" in
    6.6.30*) ;;
    *)
        echo "MCom03R PVR desktop requires kernel 6.6.30; running: $(uname -r)" >&2
        exit 1
        ;;
esac

command -v unshare >/dev/null 2>&1 || {
    echo "unshare is required by the isolated PVR Xorg launcher." >&2
    exit 1
}
command -v mount >/dev/null 2>&1 || {
    echo "mount is required by the isolated PVR Xorg launcher." >&2
    exit 1
}
[ -d /usr/local ] || {
    echo "/usr/local must exist as the vendor Xorg bind-mount target." >&2
    exit 1
}

if ! grep -q '^pvrsrvkm ' /proc/modules; then
    modprobe pvrsrvkm
fi
grep -q '^pvrsrvkm ' /proc/modules || {
    echo "The pvrsrvkm kernel module could not be loaded." >&2
    exit 1
}

display=unknown
for argument in "$@"; do
    case "$argument" in
        :[0-9]*) display=${argument#:}; display=${display%%.*}; break ;;
    esac
done
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/Xorg-$display.log"

# Only Xorg sees the legacy /usr/local tree. LightDM, XFCE, systemd, RPM and
# ordinary ALT processes continue to use the native ALT P11 filesystem.
exec unshare -m sh -c '
    set -eu
    root=$1
    config=$2
    log_file=$3
    shift 3

    mount --make-rprivate /
    mount --bind "$root/usr/local" /usr/local

    export PATH="/usr/local/bin:$root/usr/bin:/usr/bin:/bin"
    export LD_LIBRARY_PATH="$root/vendor/lib:/usr/local/lib"
    export LIBGL_DRIVERS_PATH=/usr/local/lib/dri
    export FONTCONFIG_PATH=/usr/local/etc/fonts

    exec /usr/local/bin/Xorg "$@" \
        -config "/usr/local/etc/X11/$config" \
        -configdir /usr/local/share/X11/xorg.conf.d \
        -modulepath /usr/local/lib/xorg/modules \
        -xkbdir /usr/local/share/X11/xkb \
        -fp /usr/local/share/fonts/X11/misc,/usr/local/share/fonts/X11/Type1,/usr/local/share/fonts/X11/100dpi,/usr/local/share/fonts/X11/75dpi \
        -logfile "$log_file" -verbose 6 -logverbose 7
' sh "$ROOT" "$CONFIG" "$LOG_FILE" "$@"
